每小时从标准.gz日志文件中提取和计算值

时间:2013-11-23 18:14:53

标签: linux unix sed awk zcat

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

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

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

3 个答案:

答案 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,会抱怨。不是元字符