我正在尝试按小时计算一堆.gz
日志文件中特定字符串的出现次数。每个日志文件语句都以以下时间格式开头:
2013-11-21;09:07:23.433.
例如,为了更清楚,在上午8点到9点之间,然后是上午9点到上午10点之间找到字符串"abc"
的出现次数,依此类推。关于如何做的任何想法?
答案 0 :(得分:1)
由于您只想对事件进行计数,因此您可以只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
\K
表达式中添加的grep
是PCRE中俯视的标志 - Perl兼容正则表达式。
答案 1 :(得分:1)
试试这个:
zgrep -c '2013-11-21;0[89]:.*abc' file.gz
答案 2 :(得分:0)
或者awk(linux中的gawk)可以工作:
zcat *.gz | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
重定向就在那里,因为一些问题,特别是gawk,会抱怨。不是元字符