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

regex – 如何使用Perl在两个时间戳之间的文件中搜索行?

发布时间:2020-12-16 06:24:53 所属栏目:大数据 来源:网络整理
导读:在Perl中,我试图读取一个日志文件,并且只打印具有两个特定时间之间的时间戳的行.时间格式为hh:mm:ss,这始终是每个日志的第三个值.例如,我会搜索在12:52:33到12:59:33之间的行 我是Perl的新手,并且不知道采取哪条路线来开始编程.我很确定这会使用某种类型的
在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;
}

(编辑:李大同)

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

    推荐文章
      热点阅读