【问题标题】:grep between date ranges in a log日志中日期范围之间的 grep
【发布时间】:2012-11-10 03:43:28
【问题描述】:

我正在尝试 grep 2 个日期范围之间的所有行,其中日期的格式如下: date_time.strftime("%Y%m%d%H%M") 所以说 [201211150821 - 201211150824]

我正在尝试编写一个脚本,其中涉及查找这些日期之间的行:

cat <somepattern>*.log | **grep [201211150821 -  201211150824]** 

我正在尝试找出 unix 中是否存在某些东西,我可以在其中查找日期范围。

我可以将日志中的日期转换为(自纪元以来),然后将常规 grep 与 [time1 - time2] 一起使用,但这意味着读取每一行,提取时间值,然后进行转换等。

可能已经存在一些简单的东西,所以我可以指定日期/时间戳范围,就像我可以向 grep 提供数字范围一样?

谢谢!

附注: 我也可以传入类似 2012111511(27|28|29|[3-5][0-9]) 的模式,但这特定于我想要的范围,并且每次尝试不同的日期都很乏味并且变得更加棘手在运行时进行。

【问题讨论】:

  • 最简单的方法是gawk + 将日期解析为纪元时间 + 在gawk 中过滤
  • 正则表达式没有数值范围的概念。只有字符。如果您不想每次都创建特定的正则表达式,那么 grep 不是正确的工具。

标签: regex shell datetime grep


【解决方案1】:

使用 awk。假设该行中的第一个标记是时间戳:

awk '
BEGIN { first=ARGV[1]; last=ARGV[2]; }
$1 > first && $1 < last { print; }
' 201211150821 201211150824

【讨论】:

    【解决方案2】:

    Perl 解决方案:

    perl -wne 'print if m/(?<!\d)(20\d{8})(?!\d)/
                          && $1 >= 201211150821 && $1 <= 201211150824'
    

    (它找到以20 开头的第一个十位整数,如果该整数在您感兴趣的范围内,则打印该行。如果它没有找到任何这样的整数,它会跳过该行。您可以调整正则表达式,使其对有效月份和时间等更具限制性。)

    【讨论】:

      【解决方案3】:

      您正在寻找有点晦涩的“csplit”(上下文拆分)命令:

      csplit '%201211150821%' '/201211150824/' 文件

      将从文件中拆分出第一个和第二个正则表达式之间的所有行。如果您的文件按日期排序(您说您在 grepping 日志),这可能是最快和最短的。

      【讨论】:

        【解决方案4】:

        仅限 Bash + coreutils 的 expr:

        export cmp=201211150823 ; cat file.txt|while read line; do range=$(expr match "$line" '.*\[\(.*\)\].*'); [ "x$range" = "x" ] &amp;&amp; continue; start=${range:0:12}; end=${range:15:12}; [ $start -le $cmp -a $end -ge $cmp ] &amp;&amp; echo "match: $line"; done

        cmp是你的比较值,

        【讨论】:

          【解决方案5】:

          我为类似搜索编写了一个特定工具 - http://code.google.com/p/bsearch/

          在您的示例中,用法将是:

          $ bsearch -p '$[YYYYMMDDhhmm]' -t 201211150821 -t 201211150824 日志文件。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-12-11
            • 2011-07-28
            • 2019-09-15
            • 2022-11-02
            相关资源
            最近更新 更多