Просто удалите ведение журнала:
# tune2fs -O ^has_journal /dev/sdbX
# fsck.ext2 /dev/sdbX
Затем вы можете просто удалить файл .journal
.
Поскольку вы уже знаете о режиме «абзац», следующий подход должен сработать. Сначала он проанализирует файл «patterns», а затем фактический ввод. Вывод выводится на консоль, как обычно, но, конечно, может быть перенаправлен в файл :
.awk -v ORS="\n\n" 'NR==FNR{pat[++npat]=$0;next}
{for (i=1;i<=npat;i++) {if (index($0,pat[i])) {print;next}}}' patterns.txt RS="" input.txt
Прежде всего, это установит разделитель выходной записи в два символа новой строки, гарантируя, что напечатанные абзацы будут разделены пустой строкой, как во входных данных.
При обработке первого файла (, где FNR
, счетчик на -строк файла -равен NR
, глобальному счетчику строк ), мы просто сохраняем все шаблоны в массиве переменная pat
.
Для второго файла разделитель записей устанавливается пустым, что указывает awk
на запуск в «режиме абзаца». Затем мы перебираем все шаблоны и явно смотрим, найдены ли они во входной записи с помощью функции index()
.
Примечание
Это решение будет выполнять «частичное сопоставление строк», то есть абзац будет считаться совпадением, если любой из «шаблонов» встречается где-либо в одной из строк.
Функция index()
используется потому, что она гарантирует буквальное сопоставление строк даже в тех случаях, когда ваши «шаблоны поиска» содержат специальные символы для регулярных выражений. Если вы действительно хотите использовать сопоставление регулярных выражений, используйте вместо этого if ($0 ~ pat[i])
.
Чтобы сопоставить шаблоны в match
, введите каждый как отдельный шаблон с вводом infile
, попробуйте:
awk -F'\n' '!input && !matches[$0]{ next; };
{ for(i=1; i<=NF; i++) {
if($i in matches) { print sep $0; sep=ORS; break; };
};
}' match input=1 RS= infile
или для сопоставления шаблонов из вводаmatch
в качестве блока шаблонов с вводомinfile
(добавьте один блок, аналогичный вводу match
, к infile
, чтобы проверить ), попробуйте:
awk -v RS= '!input && !matches[$0]{ next; }; ($0 in matches)' match input=1 infile
Предполагая, что вы хотите выполнить полное -сопоставление строк, это то, что вам нужно:
$ cat tst.awk
BEGIN {
ORS = "\n\n"
FS = "\n"
}
NR==FNR {
tgts[$0]
next
}
{
out = "unmatched"
for (i=1; i<=NF; i++) {
if ($i in tgts) {
out = "matched"
break
}
}
print > out
}
$ awk -f tst.awk targets RS= file
$ ls *matched
matched unmatched
$ head -100 *matched
==> matched <==
DFJKHDKQW
YYYYYYYYYYYY
SDFLKJHSDKLFH
DSFLKHSDLKFH
DFIHERFW
ADFKJH
OIGHRFGH
XXXXXXXXXXXX
SDKFLJH
OIHGSDFG
AAAAAAAA
LFKHFGJKDGH
KLJHLUG
DFSDKLF
YYYYYYYYYYYY
==> unmatched <==
DFLKHSDFKLH
SDSDJKLFHSDK
Если вам нужно использовать регулярное выражение вместо совпадения строк и/или частичное совпадение вместо полного или что-то еще, вам потребуется другое решение (и, пожалуйста, обновите свой вопрос, чтобы лучше сформулировать свои требования ).