Tail Grep – печать окружающих линий до тех пор, пока шаблон не будет сопоставлен

Итак, вот мое требование.

Я хвост файла журнала и grepping на нем.
Я хочу получить некоторый контекст для каждого результата grep.
Но контекст должен быть «до согласования шаблона», а не количеством строк (что является предложением grep -A/-B/-C ).

Например
Скажем, это мой журнал.

[l] имеет префикс для каждой строки журнала. Также будет префикс [logTypeA] или [logTypeB]

 [l][logTypeA] - Log line 1 [l][logTypeB] - Log line 2 [l][logTypeA] - Log line 3 .... Random data about Log line 3 .... [l][logTypeB] - Log line 4 

Теперь моя, если моя команда tail -f log_file.log | grep "[logTypeA]" была tail -f log_file.log | grep "[logTypeA]" tail -f log_file.log | grep "[logTypeA]" , я получаю вывод

 [l][logTypeA] - Log line 1 [l][logTypeA] - Log line 3 

Но мне нужна контекстная информация для моего результата grep, и этот контекст НЕ является некоторым количеством строк, а скорее до тех пор, пока не будет определен конкретный шаблон (в данном случае [l]).

В этом примере я хочу, чтобы мой результат grep был

 [l][logTypeA] - Log line 1 [l][logTypeA] - Log line 3 .... Random data about Log line 3 .... 

Отсюда ( как показать строки после каждого совпадения grep до другого конкретного совпадения? ), Я попробовал команду sed на моем tail как

 tail -f log_file.log | sed '/\[logTypeA\]/,/\[l\]/p' 

Но это не работает.

Есть идеи?

2 Solutions collect form web for “Tail Grep – печать окружающих линий до тех пор, пока шаблон не будет сопоставлен”

Это чрезвычайно распространенная модель с Awk. Соберите связанные строки в «записи», распечатайте запись, когда вы ее собрали, если она соответствует определенному условию.

 tail -f file | awk '/\[l]/ { if (p && stored) print stored; stored = ""; p=0 } /\[logTypeA]/ { p=1 } { stored = stored (stored ? ORS : "") $0 } END { if (p) print stored }' 

Условие END самом деле не имеет смысла с бесконечным потоком из tail -f но я включаю его для хорошей оценки и избегаю надоедливых тестов, когда последняя запись, которую вы хотите протестировать, должна быть напечатана, но не будет без условия END .

Я, вероятно, в конечном итоге сделаю это с помощью perl one-liner. Вы можете сделать это в sed, но похоже, что он начинает сталкиваться с частью непреднамеренного turing-completeness.

Perl one-liner ( perl -ne действительно забирает здесь)

 echo '[l] boring\nboring data\n[l] boring\n[l]interesting\ndata\ndata\n[l]boring' | perl -ne ' if (/\[l\].*interesting/ ) { print $_; $collect=1 ; } elsif (/\[l\]/) {$collect=0 } elsif ($collect) {print $_}' 

Для справки, вот sed однострочный, который делает то же самое. (Особенности sed используются: b для достижения переключения, T для достижения условного исполнения).

 echo '[l] boring\nboring data\n[l] boring\n[l\]interesting\ndata\ndata\n[l]boring' | sed -nE '/\[l\].*interesting/ { p; s/.*/collect/ ; x ; # store collect marker in the pattern space b; # terminate processing } /\[l\]/ { s/.*// ; x; # clear hold flag b } /./ { x; s/collect/collect/; T; x; p # print if we are collecting } ' 
  • Можно ли изменить количество строк по умолчанию хвоста?
  • grep не работает в цикле for по списку
  • выход tailf как параметр скрипта
  • Как следить и искать в файле, проходящем через фильтр, менее
  • Временно заморозить процесс при взаимодействии оболочки
  • Можно ли «перевернуть» символическую ссылку на новый файл, не затрагивая никаких открытых дескрипторов файлов?
  • Как я могу скопировать n строк после последних двух вхождений строки в файл?
  • Как сделать «хвост -f» файлов с чередованием логов?
  • разделение CSV и сохранение заголовка без промежуточных файлов
  • Редактирование текстового файла с Vim не обновляет tail -f
  • Cygwin - хвост останавливает чтение входной трубы после первой записи
  • Выполнение хвоста -f в текстовом файле поверх sshfs не работает. Зачем?
  • Linux и Unix - лучшая ОС в мире.