【发布时间】:2013-12-08 13:59:41
【问题描述】:
我试图每小时从一堆.gz 日志文件中计算特定字符串的出现次数。每个日志文件语句都以以下时间格式开始:
2013-11-21;09:07:23.433.
例如,为了更清楚,查找字符串"abc" 在上午 8 点到 9 点之间,然后是上午 9 点到 10 点之间的出现次数,依此类推。关于如何做到这一点的任何想法?
【问题讨论】:
我试图每小时从一堆.gz 日志文件中计算特定字符串的出现次数。每个日志文件语句都以以下时间格式开始:
2013-11-21;09:07:23.433.
例如,为了更清楚,查找字符串"abc" 在上午 8 点到 9 点之间,然后是上午 9 点到 10 点之间的出现次数,依此类推。关于如何做到这一点的任何想法?
【问题讨论】:
由于您只想计算出现次数,您可以简单地 zcat 文件的内容,grep 描述您要查找的内容的部分——单词/时间间隔——,最后排序/计数(sort | uniq -c) 条目。以下可能就足够了:
zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\d{2}" | sort | uniq -c
上述命令将在您的日志文件中找到包含您要查找的<word> 的行,从这些条目中提取日期和小时,然后计算出现次数。
如果您不想考虑天/月/年,您可以使用:
zcat *.gz | grep <word> | grep -oP "^\d{4}-\d{2}-\d{2};\K\d{2}" | sort | uniq -c
在grep 表达式中添加的\K 是PCRE 中的后视标志——Perl 兼容正则表达式。
【讨论】:
或者 awk(Linux 中的 gawk)可以工作:
zcat *.gz | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
重定向存在是因为一些 awk,尤其是 gawk,会抱怨 .不是元字符
【讨论】:
试试这个:
zgrep -c '2013-11-21;0[89]:.*abc' file.gz
【讨论】: