Конвейеры, как правило, должны быть короткими, и большинство вещей, которые вы делаете для получения значения для count
, могут быть выполнены в одной awk
программе, включая цикл и оператор if
.
awk 'FNR == 1 || !/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 { print FILENAME }'./*
Это запускает одну awk
программу для всех не -скрытых файлов в текущем каталоге.
Программа сбросит свою переменную count
в ноль, если мы находимся на первой строке нового файла или , если текущая строка не соответствует шаблону FATAL ERROR
.
Если строка соответствует шаблону FATAL ERROR
, значение переменной count
увеличивается.
Если значение переменной count
достигает 2, печатается имя текущего файла.
Код будет печатать имя файла каждый раз, когда находит две последовательные строки, соответствующие шаблону, даже если это происходит несколько раз в одном и том же файле. Если это не нужно, вы можете немного расширить код:
awk 'FNR == 1 { count = 0; do_print = 1 }
!/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 && do_print { print FILENAME; do_print = 0 }'./*
или с GNU awk
(, используя nextfile
, чтобы перейти к следующему файлу):
awk 'FNR == 1 || !/FATAL ERROR/ { count = 0 }
/FATAL ERROR/ { ++count }
count == 2 && do_print { print FILENAME; nextfile }'./*
Относится к циклу вашей оболочки: