我想打印所有可以说在其值由 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;
}
如果我更换
$timestamp
在 cat
来自 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/