我有一个日志文件,其中的错误将在行的开头提到"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语句。