在Perl中,我试图读取一个日志文件,并且只打印具有两个特定时间之间的时间戳的行.时间格式为hh:mm:ss,这始终是每个日志的第三个值.例如,我会搜索在12:52:33到12:59:33之间的行
我是Perl的新手,并且不知道采取哪条路线来开始编程.我很确定这会使用某种类型的正则表达式,但对于我的生活,我甚至无法理解那将是什么.有人可以帮助我这个.
另外,为了使这更加困难,我必须使用核心Perl模块执行此操作,因为我的公司不允许我使用任何其他模块,直到它们经过测试和验证,对脚本可能没有任何系统的不良影响与…相互作用.
解决方法
在伪代码中,你会做这样的事情:
>逐行读入文件:
>解析此行的时间戳.
>如果小于开始时间,请跳至下一行.
>如果它大于结束时间,请跳到下一行!
>否则:这是你想要的一行:打印出来.
这可能对您的需求来说太高级了,但是flip-flop operator …会立即浮现在脑海中,因为这里有用.
对于从stdin读取文件,这是传统模式:
while (my $line = <>) { # do stuff... }
通过拆分可以轻松地将一条线解析为字段(参见perldoc -f split).您可能需要按标签或空格分割线条,具体取决于格式.
获得特定字段(包含时间戳)后,可以使用自定义的正则表达式检查它.阅读有关perldoc perlre的内容.
这可能会让你更接近:
use strict; use warnings; use POSIX 'mktime'; my $starttime = mktime(33,52,12); my $endtime = mktime(33,59,12); while (my $line = <>) { # split into fields using whitespace as the delimiter my @fields = split(/\s+/,$line); # the timestamp is the 3rd field my $timestamp = $fields[2]; my ($hour,$min,$sec) = split(':',$timestamp); my $time = mktime($sec,$hour); next unless ($time < $starttime) .. ($time > $endtime); print $line; }