【问题标题】:How to count lines of a file within date range in bash?如何在bash中计算日期范围内的文件行数?
【发布时间】:2016-11-02 16:49:46
【问题描述】:

我在服务器上使用 centos,我想计算特定日期范围内文件的行数?我正在尝试调试我的程序。

2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:06+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:07+00:00
2016-06-30T14:09:08+00:00
2016-06-30T14:09:08+00:00

如果我想计算给定日期范围从2016-06-30T14:09:06+00:00 - 2016-06-30T14:09:08+00:00 包含在该文件中有多少行,那么现在的数据将是这样的。那可能吗?

结果应该是 10

【问题讨论】:

    标签: bash shell centos


    【解决方案1】:

    感谢 cmets 中的建议,使用 grep-c 标志来获取实例数。

    grep -c 2016-06-30T14:09:0[6-8]+00:00 file 
    

    模式[6-8],一个正则表达式,用于匹配文件中2016-06-30T14:09:06+00:02016-06-30T14:09:08+00:0 之间的所有日志。

    使用grep获取内容,awk打印行数

    grep 2016-06-30T14:09:0[6-8]+00:00 file | awk 'END{print NR}'
    10
    

    也可以使用bash word count wc util,这比 cmets 中的karakfa 建议的 awk 更快。

    grep 2016-06-30T14:09:0[6-8]+00:00 file | wc -l
    10
    

    【讨论】:

    • ... | wc -l 更短。
    • 为什么不grep -c
    • 注意这个语法可以单独在awk 中完成 --> awk '/2016-06-30T14:09:0[6-8]+00:00/ {sum++} END{print sum}' file
    • @fedorqui 我认为这可能是 grep 是更好/更简单的选择的少数情况之一。
    • @123 确实如此,grep -c 在这种情况下是清晰易懂的。
    【解决方案2】:

    只需正常比较它们:您可以使用字母数字比较来比较您的时间戳并得到正确答案 - 这就是 ISO 8601 表示法的美妙之处 (source)。

    awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" \
     '$0>=ini && $0<=end {sum++} END{print sum}'
    

    使用您的文件:

    $ awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" '$0>=ini && $0<=end {sum++} END{print sum}' file
    10
    

    使用更具代表性的输入:

    $ cat t
    2015-06-30T14:09:06+00:00
    2016-06-29T14:09:06+00:00
    2016-06-30T14:09:05+00:00
    2016-06-30T14:09:06+00:00
    2016-06-30T14:09:07+00:00
    2016-06-30T14:09:07+00:00
    2016-06-30T14:09:08+00:00
    2016-06-30T14:09:09+00:00
    2016-06-30T14:10:08+00:00
    2016-07-30T14:09:08+00:00
    $ awk -v ini="2016-06-30T14:09:06+00:00" -v end="2016-06-30T14:09:08+00:00" '$0>=ini && $0<=end' t
    2016-06-30T14:09:06+00:00
    2016-06-30T14:09:07+00:00
    2016-06-30T14:09:07+00:00
    2016-06-30T14:09:08+00:00
    

    【讨论】:

    • 哇!我最初认为这很难破解。
    • @sjsam 没有硬核 awk :)
    • AFAIK awk 无法比较日期。请给我看一些说明可以的文件。过去我犯了一个错误,认为这样的事情已经奏效了。据我所知,这只是进行字符串比较,很方便。
    • @123 实际上你是对的。引用Jonathan Leffler关键的观察是,您可以使用字母数字比较来比较您的时间戳并得到正确的答案——这就是 ISO 8601 表示法的美妙之处。
    • @hek2mgl 确实!请参阅我关于 ISO 8601 的最后一条评论(好吧,前一条:D)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-05-18
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-06-25
    相关资源
    最近更新 更多