Вы можете использовать perl
для извлечения файла из файла:
$ perl -0777 -lnE 'while (/^(?=[\d.:]+[ \t]+DEBUG[^\n]*$)(.+?)(?=^[\d.:]+[ \t]+DEBUG|\z)/gms)
{ $s=$1;
say "$s" if $s =~ m/^Sample Text4/ms }' file
01:15:21.882 DEBUG [SampleProcess1]
Summary Report
Sample Text1: 126
Sample Text2: 2330
Sample Text3: 2331
Sample Text4: 0
Это работает с двумя предвидениями ^(?=[\d.:]+[ \t]+DEBUG[^\n]*$)
, которые разделяют пример на три блока, разделенных линией со DEBUG
в нем.
DEMO
Как только у вас есть каждый блок, вы можете проверить, находится ли подстрока внутри этого блока, с помощью
m/^Sample Text4/ms
Если подстрока найденараспечатать блок.
Вот решение POSIX sed, которое включает в себя обращение файла (с tail -r
), поиск двух шаблонов в обратном порядке, а затем повторную сборку файла в исходном порядке:
$ tail -r file.log | sed -n '/^Sample Text4/,/DEBUG/p' | tail -r
(Добавление -r
к tail
является довольно недавним добавлением POSIX и может отсутствовать в вашей ОС. Это в последних выпусках BSD и OS X.)