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

标签 regex perl timestamp

在 Perl 中,我试图读取一个日志文件,并且只打印在两个特定时间之间具有时间戳的行。时间格式为 hh:mm:ss,这始终是每个日志上的第三个值。例如,我将搜索介于 12:52:33 到 12:59:33 之间的行

我是 Perl 的新手,甚至不知道该采取哪条路线来开始编程。我很确定这将使用某种类型的正则表达式,但对于我的生活,我什至无法开始理解那会是什么。有人可以帮我解决这个问题。

此外,为了使这更困难,我必须使用核心 Perl 模块来执行此操作,因为我的公司不允许我使用任何其他模块,直到它们经过测试和验证不会对脚本可能的任何系统产生不良影响与。。。相互作用。

最佳答案

在伪代码中,你会做这样的事情:

  • 逐行读取文件:
  • 解析这一行的时间戳。
  • 如果小于开始时间,则跳到下一行。
  • 如果大于结束时间,跳到下一行!
  • 否则:这是您想要的一行:打印出来。

  • 这可能对您的需要来说太高级了,但是 flip-flop operator ..立即想到这里有用的东西。

    对于从标准输入读取文件,这是常规模式:
    while (my $line = <>)
    {
         # do stuff...
    }
    

    使用 split 可以轻松地将行解析为字段(见 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, $min, $hour);
    
        next unless ($time < $starttime) .. ($time > $endtime);
        print $line;
    }
    

    关于regex - 如何使用 Perl 在文件中的两个时间戳之间搜索行?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3134882/

    相关文章:

    java - 如何将时间戳值限制为秒?

    regex - 正则表达式执行多次替换

    .net - 将 IEnumerable<char> 转换为字符串的最佳方法?

    perl - 在 Perl 教程中出现 Bareword 错误

    javascript - 为什么这个 Javascript RegExp 返回 true?

    Perl 和 mod_fcgid-我如何确定它在工作?

    arrays - Perl push 函数给出索引值而不是数组元素

    postgresql - 在 Postgres 中使用带有时间戳值的 BETWEEN 运算符

    java - 模式匹配删除 wiki 标记

    python - 如何从 pandas 数据框中的列中删除文本