Ключ заключается в том, чтобы поместить строки, которые вы, возможно, захотите напечатать, в буфер (массив), заменив их, если вы найдете более позднее совпадение.
my @buf;
my $keep = 0;
while (<>) {
if (/ERROR/) {
@buf = $_; # Discard any earlier match in favour of this one.
$keep = 1; # Also keep one more line.
}
elsif ($keep) {
--$keep;
push @buf, $_;
}
}
print(@buf);
Вышеуказанное обычно ведет себя идентично Команду вы отправили. Однако, если после строки, содержащей ERROR
, есть две строки, вышеприведенное поведение будет отличаться от введенной вами команды.
log1
:
ERROR foo1
foo2
meow
ERROR bar1
bar2
woof
log2
:
ERROR foo1
foo2
meow
ERROR bar1
Ваша команда:
$ grep -A1 ERROR log1 | tail -2
ERROR bar1
bar2
$ grep -A1 ERROR log2 | tail -2
--
ERROR bar1
Моя программа:
$ ./last_error log1
ERROR bar1
bar2
$ ./last_error log2
ERROR bar1
Это, вероятно, улучшение.