perl - 如何打印特定时间后发生的日志文件中的行

标签 perl unix

我想打印所有可以说在其值由 localtime 返回的时间之后发生的行perl 的功能里面perl脚本。我试过如下:

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

如果我更换 $timestampcat来自 xyz.log 的带有实际时间分量的命令然后它打印行但不打印 $timestamp多变的。

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

最佳答案

您的 $timestamp永远不会在 Perl 中求值,因为它只出现在单引号中。但是为什么要使用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 - 如何打印特定时间后发生的日志文件中的行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39404290/

相关文章:

perl - 我可以使用哪些其他诊断方法来解决这个特定的 Perl 问题?

perl - 在 Marpa 语法中制作 0+ 长度列表的简洁方法?

c - 什么时候需要 F_GETFL fcntl 命令的参数?

C HTTP 服务器 - 多线程模型?

unix - FreeBSD 中 copyout() 的实现

regex - 我如何在 perl 中像这样 (.+) 为指定的字符串使用正则表达式?

perl - 如何从 Moose 包中导出子例程?

r - 查找一组字符串中子字符串的频率

linux - 当您涉及软链接(soft link)时, "cd .."和 "pwd"究竟意味着什么?

c - 套接字未收到消息 AF_UNIX