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' 

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

Есть идеи?

  • разделение CSV и сохранение заголовка без промежуточных файлов
  • Как я могу использовать Awk для преобразования временной отметки unix для чтения человеком при создании файла журнала Tail-f?
  • Как извлечь количество физических процессоров и потоков на ядро? (Нет текста, только номер для использования в качестве входных данных в другом месте)
  • Сохранять счет из файла журнала
  • Скользящее среднее в файле журнала с awk или другими утилитами unix?
  • Каков самый простой способ выполнить текст из хвоста в командной строке?
  • Tail -f передается через grep, не выводящий в файл, но выводит на консоль
  • Трубопровод от grep до awk не работает
  • 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 } ' 
    Linux и Unix - лучшая ОС в мире.