我很有兴趣在匹配正则表达式“严重”或“错误”之前抓住10行。 目前我正在打印$ _,它只给我正则表达式匹配的行。
我在perl Worte中如下:
#!/usr/bin/perl -w
use strict;
open LOG, "/Users/erangross/Projects/perl/log" or die;
while (<LOG>){
if (/critical | error/){
open (myFile, '>>parser_log.txt');
print myFile $_;
}
}
答案 0 :(得分:4)
它必须是perl吗? GNU grep
使您可以选择在匹配行之前/之后打印指定数量的“上下文”行,例如
grep --before-context=10 '(critical \| error)' parserlog.txt
答案 1 :(得分:3)
使用Tie::File
。它是Perl v5.7.3以来的核心模块,因此不需要安装。
Tie::File
允许您随机访问文件中的记录,就像它们是数组元素一样。问题被简化为简单地跟踪匹配的数组的索引,并打印少于9的索引中的所有元素。
use strict;
use warnings;
use Tie::File;
open my $plog, '>', 'parser_log.txt' or die $!;
tie my @log, 'Tie::File', '/Users/erangross/Projects/perl/log' or die $!;
for my $i (0 .. $#log) {
next unless / critical | error /xi;
my $start = $i > 9 ? $i - 9 : 0;
print $plog $log[$_] for $start .. $i;
}
答案 2 :(得分:2)
使用数组。他们可以帮忙。在这里,我将它用作一种FIFO或队列:
#!/usr/bin/perl
use warnings;
use strict;
open LOG, "<", "/Users/erangross/Projects/perl/log" or die "Can't open log: $!";
open my $parseLog, '>>', 'parser_log.txt') or die "Can't open output file: $!";
my @lastTenLines;
while (<LOG>){
push @lastTenLines, $_; # add current line.
shift @lastTenLines while @lastTenLines > 10; # remove lines outside your scope.
print $parseLog @lastTenLines if /critical | error/x; # print if there is a find.
}