如何搜索文件中最后一个字符串,并在perl中获取下一行



我有一个日志文件,其中的错误将在行的开头提到"ERROR",下一行将有关于错误的详细文本。我想在文件中搜索最后一次出现的"ERROR",这样我就可以找到最后一个错误并打印下一行,或者将该行复制到变量中。

在shell中,我可以尝试下面的命令,这将帮助我实现同样的目的。有人能给我一个等效的Perl代码吗?

grep-A1错误sapinst.log |尾部-2

由于日志文件将是巨大的(大约5000多行(,所以我不想将其存储在数组中。

关键是将您可能想要打印的行放在缓冲区(数组(中,如果以后找到匹配的行,则替换它们。

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

这可能是一个进步。

尝试2个长的行缓冲区:

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

这将打印最后一个错误(或"未找到错误"(。要获取所有错误,请将while循环中的赋值更改为print语句。

最新更新