Подтвердить что ты не робот

Как установить grep после контекста как "до следующей пустой строки"?

С grep я знаю, как установить контекст на фиксированное количество строк. Можно ли показать контекст на основе произвольного строкового условия, например set after-context для "до следующей пустой строки"?

Или, возможно, какая-то другая комбинация инструментов?

В основном у меня есть файл журнала смежных строк, с пустыми строками, разделяющими "события", я хочу искать строку в файле журнала, но показывать все событие....

4b9b3361

Ответ 1

Похоже, вам нужно sed:

sed -n '/pattern/,/^$/p' file

Не печатать по умолчанию (-n). Для строк, соответствующих /pattern/ до пустой строки /^$/, напечатайте.

Ответ 2

Простое решение:

awk '/pattern/' RS= input-file

Установка RS в пустую строку делает awk обрабатывать пустые строки в качестве разделителя записей, а простое правило /pattern/ заставляет awk печатать любую запись, которая соответствует шаблону, который может быть любым расширенным регулярным выражением.

Ответ 3

Здесь (проверено) решение awk, разделенное на несколько строк для удобочитаемости:

awk '/pattern/ {do_print=1}
     do_print==1 {print}  
     NF==0 {do_print=0}' input_file

Этот script также напечатает пустую строку, чтобы было легче визуально разделить разные согласованные блоки. Если вам не нужна пустая строка, замените 2 строки do_print==1 {print} и NF==0 {do_print=0}

Объяснение:

  • awk: вызвать инструмент awk - он последовательно оценивает входную строку в строке.
  • '...'.: все, заключенные одинарными кавычками, даны awk в качестве инструкций. В этом случае мы выполняем цитируемые инструкции для каждой строки.
  • /pattern/ {do_print=1}: всякий раз, когда строка содержит "pattern", включите флаг do_print
  • do_print==1 {print}: если флаг do_print включен, распечатайте текущую строку.
  • NF==0 {do_print=0}: NF обозначает количество полей. awk по умолчанию ограничивает каждую строку пробелами и вкладками, чтобы разбить строку на поля. В этом случае тривиально пустая строка не имеет полей - поэтому мы выключаем флаг do_print, чтобы прекратить печать, когда мы видим строку с NF == 0