Ваш размер файла довольно маленький, а perl довольно быстрый, поэтому я бы не стал беспокоиться об обратном порядке. Эта небольшая программа читает строки ввода из файлов, которые вы указали в командной строке (или стандартный ввод, если вы ничего не указали), пропускает строки до тех пор, пока не найдет ERROR
, затем печатает эту и следующую строку:
#!perl
while( <> ) {
next unless /ERROR/;
print;
print scalar <>;
}
Оттуда вы можете использовать tail
, если хотите. Это Perl делает то же самое, что и опубликованный вами grep (хотя, поскольку у вас уже есть это решение, мне интересно, почему вы хотите другое).
Если вы не хотите использовать tail
, следите из двух строк, которые вы выведете и замените их, когда найдете новый набор:
my( $error_line, $next_line );
while( <> ) {
next unless /ERROR/;
$error_line = $_;
$next_line = scalar <>;
}
print $error_line, $next_line;
Если у вас достаточно недавно perl, вы можете использовать более безопасный оператор ввода двойных ромбов :
use v5.22;
my( $error_line, $next_line );
while( <<>> ) {
next unless /ERROR/;
$error_line = $_;
$next_line = scalar <<>>;
}
print $error_line, $next_line;
Вы можете использовать File :: ReadBackwards , но вам придется выполнить ту же задачу, запоминая каждую строку, а затем проверяя, имела ли предыдущая строка ERROR
. Для ваших размеров данных выгода, вероятно, не очевидна. Если простое решение не достаточно быстрое, пришло время задуматься (но не раньше).