Вот решение на Perl:
perl -nlE '
if (/a/) { @buffer = ($_) }
elsif (/xyz/) { push @buffer,$_; say for @buffer }
else { push @buffer,$_}
' your_file
Как это работает
Он читает файл построчно и выполняет одно из трех действий:
a
, она присваивает текущую строку массиву @buffer
. xyz
, она помещает текущую строку в буфер и печатает его содержимое. @buffer
. Таким образом, всякий раз, когда новая строка соответствует шаблону a
, содержимое @buffer
стирается и заменяется только текущей строкой. Это гарантирует, что вы найдете ближайший a
, предшествующий xyz
.
Вы, конечно, должны заменить регулярные выражения, которые я использовал, на настоящие регулярные выражения, относящиеся к вашему случаю.
Если процесс делает много памяти IO, то это будет перевести в использование много времени процессора, поэтому планировщик будет приходится для него, косвенно.