我想打印所有行,这些行可以说是在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;