我试图每小时统计一组.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};Kd{2}" | sort | uniq -c
在grep
表达式中添加的K
是PCRE-PerlCompatibleRegularExpression中查找落后的标志。
试试这个:
zgrep -c '2013-11-21;0[89]:.*abc' file.gz
或者awk(linux中的gawk)会起作用:
zcat *.gz | awk -F'[.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
重定向之所以存在,是因为一些awk,尤其是gawk,会抱怨。不是元字符