Как найти последнее вхождение строки в файле и получить следующую строку вместе с ней в perl - PullRequest
0 голосов
/ 16 марта 2020

У меня есть файл журнала, в котором ошибки будут упоминаться как «ОШИБКА» в начале строки, а в следующей строке будет содержаться подробный текст об ошибке. Я хотел бы найти последнее вхождение «ОШИБКА» в файле, чтобы я мог найти последнюю ошибку и напечатать следующую строку или скопировать строку в переменную.

В оболочке я могу попробовать ниже команда, которая поможет мне добиться того же. Может кто-нибудь дать мне эквивалентный Perl код?

grep -A1 ОШИБКА sapinst.log | tail -2

Поскольку файл журнала будет огромным (~ 5000 + строк), поэтому я не хочу хранить его в массиве.

Ответы [ 2 ]

1 голос
/ 19 марта 2020

Ключ заключается в том, чтобы поместить строки, которые вы, возможно, захотите напечатать, в буфер (массив), заменив их, если вы найдете более позднее совпадение.

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

Это, вероятно, улучшение.

0 голосов
/ 16 марта 2020

Попробуйте 2 длинных буфера строк:

my $match = "no error found";
my @a = ("", "");
while (<STDIN>) {
    @a = ($a[1], $_);
    $match = $a[1] if $a[0] =~ /^ERROR/i;
}
print $match;

Это печатает последнюю ошибку (или «ошибка не найдена»). Чтобы получить все ошибки, измените присвоение для сопоставления в то время как l oop на оператор печати. ​​

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...