【问题标题】:Extract and count value from standard .gz log files on an hourly basis每小时从标准 .gz 日志文件中提取和计数值
【发布时间】:2013-12-08 13:59:41
【问题描述】:

我试图每小时从一堆.gz 日志文件中计算特定字符串的出现次数。每个日志文件语句都以以下时间格式开始:

2013-11-21;09:07:23.433.

例如,为了更清楚,查找字符串"abc" 在上午 8 点到 9 点之间,然后是上午 9 点到 10 点之间的出现次数,依此类推。关于如何做到这一点的任何想法?

【问题讨论】:

    标签: linux unix sed awk zcat


    【解决方案1】:

    由于您只想计算出现次数,您可以简单地 zcat 文件的内容,grep 描述您要查找的内容的部分——单词/时间间隔——,最后排序/计数(sort | uniq -c) 条目。以下可能就足够了:

    zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\d{2}" | sort | uniq -c
    

    上述命令将在您的日志文件中找到包含您要查找的&lt;word&gt; 的行,从这些条目中提取日期和小时,然后计算出现次数。 如果您不想考虑天/月/年,您可以使用:

    zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\K\d{2}" | sort | uniq -c
    

    grep 表达式中添加的\K 是PCRE 中的后视标志——Perl 兼容正则表达式。

    【讨论】:

    • 完美。这就是我要找的谢谢!
    • @Hiten 很高兴它有帮助!如果帖子回答了您的问题,请将其标记为已接受,以便其他人知道问题已解决。为此,请选中投票箭头正下方的勾号。
    • 无用的zcat,你知道zgrep吗?
    • @sputnick 我没有回答 OP 的问题(:
    【解决方案2】:

    或者 awk(Linux 中的 gawk)可以工作:

    zcat *.gz  | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
    

    重定向存在是因为一些 awk,尤其是 gawk,会抱怨 .不是元字符

    【讨论】:

      【解决方案3】:

      试试这个:

      zgrep -c '2013-11-21;0[89]:.*abc' file.gz
      

      【讨论】:

        猜你喜欢
        • 2013-07-16
        • 2016-06-04
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        • 2015-08-29
        • 1970-01-01
        • 1970-01-01
        • 2022-10-13
        相关资源
        最近更新 更多