Ответ 1
Похоже, вам нужно sed
:
sed -n '/pattern/,/^$/p' file
Не печатать по умолчанию (-n
). Для строк, соответствующих /pattern/
до пустой строки /^$/
, напечатайте.
С grep я знаю, как установить контекст на фиксированное количество строк. Можно ли показать контекст на основе произвольного строкового условия, например set after-context для "до следующей пустой строки"?
Или, возможно, какая-то другая комбинация инструментов?
В основном у меня есть файл журнала смежных строк, с пустыми строками, разделяющими "события", я хочу искать строку в файле журнала, но показывать все событие....
Похоже, вам нужно sed
:
sed -n '/pattern/,/^$/p' file
Не печатать по умолчанию (-n
). Для строк, соответствующих /pattern/
до пустой строки /^$/
, напечатайте.
Простое решение:
awk '/pattern/' RS= input-file
Установка RS в пустую строку делает awk обрабатывать пустые строки в качестве разделителя записей, а простое правило /pattern/
заставляет awk печатать любую запись, которая соответствует шаблону, который может быть любым расширенным регулярным выражением.
Здесь (проверено) решение 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