加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 大数据 > 正文

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

发布时间:2020-12-16 06:16:09 所属栏目:大数据 来源:网络整理
导读:我想打印所有行,这些行可以说是在perl脚本内perl的localtime函数返回值之后发生的.我试过以下的东西: my $timestamp = localtime();open(CMD,'-|','cat xyz.log | grep -A1000 $timestamp' || die ('Could not open');while (defined(my $line=CMD)){ prin
我想打印所有行,这些行可以说是在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;

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读