perl – 如何在特定时间之后从日志文件中打印行

前端之家收集整理的这篇文章主要介绍了perl – 如何在特定时间之后从日志文件中打印行前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我想打印所有行,这些行可以说是在perl脚本内perl的localtime函数返回值之后发生的.我试过以下的东西:

my $timestamp = localtime();
open(CMD,'-|','cat xyz.log | grep -A1000 \$timestamp' || die ('Could not open');
while (defined(my $line=<CMD>)){
    print $line;
}

如果我用xyz.log中的actaul time组件替换cat命令中的$timestamp,那么它会打印行,但不打印$timestamp变量.

有没有其他方法可以打印日志文件中当前时间之后发生的行或者我如何改进上述命令?

解决方法

永远不会在Perl中评估您的$timestamp,因为它只出现在单引号中.但为什么要出来shell以匹配字符串并处理文件? Perl对此更好.

这是一个直接的方法,然后是一个基本的方法.第二个示例中显示了完整脚本.

读取文件,直到到达带有模式的行,然后在该点退出循环.下次访问该文件句柄时,您将进入下一行,并可以在另一个循环中开始打印.

while (<$fh>) { last if /$timestamp/ }

print while <$fh>;

这将打印出文件的一部分,该文件的一部分位于其中包含$timestamp的行之后的行.如果更具体,请调整与时间戳完全匹配的方式.

或者 – 当行与时间戳匹配时设置标志,如果设置了标志则打印.

use warnings 'all';
use strict;

my $timestamp = localtime();

my $logile = 'xyz.log';
open my $fh,'<',$logfile or die "Can't open $logfile: $!";

my $mark = 0;
while (<$fh>) 
{
    if (not $mark) { 
        $mark = 1 if /$timestamp/;
    }
    else { print }
}
close $fh;

猜你在找的Perl相关文章