Можно инвертировать логику здесь: просто сохраните все соответствующие каталоги и регулярные файлы в фиксированном, центральном каталоге, и переместите абсолютные символьные ссылки.
Если вы знаете, насколько велика запись, вы можете вывести дополнительные строки контекста до ( -B
) и после ( -A
) строка соответствия, например
grep -A2 -B2 'Fields' sample.log
или для контекста до и после строки соответствия
grep -C3 'Fields' sample.log
Насколько мне известно, единственный способ выполнить истинное многострочное сопоставление (а не сопоставление одной строки плюс контекст) в GNU grep - это использовать регулярное выражение PCRE режим ( -P
) с флагом -z
для предотвращения прерывания при переводе строки. Например, вы можете попробовать
grep -zPo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'
, который выполняет нежадное сопоставление строки Fields
, окруженной любыми символами ИЛИ новой строки, при условии, что она заполнена новой строкой-дефисами-новой строкой разделители. Эквивалентным выражением в pcregrep является
pcregrep -Mo '(\n-+\n)\K(.|\n)+?Fields(.|\n)+?(?=\n-+\n)'
. Другой вариант для этого типа данных со структурой записей - awk: в частности, GNU awk позволяет использовать регулярное выражение для внутреннего разделителя записей RS, например.
$ gawk -vRS='\n-+\n' '/Fields/ {print}' sample.log
r132279 | USERID | 2014-04-30 12:59:09 -0700 (Wed, 30 Apr 2014) | 3 lines
Removed unused "Calculated Fields" column entry.
Jira ID: JIRA-977
Решение Perl, аналогичное gawk
в ответе Steeldriver на случай gawk
недоступно:
perl -ne 'BEGIN{$/= "-"x72 . "\n"} chomp and print if /Fields/' log_file
Замените 72 фактическим количеством тире в разделителе.