我试图每小时从一堆.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
表达式中\K
添加的grep
是 PCRE 中的后视标志——Perl 兼容正则表达式。
尝试这个 :
zgrep -c '2013-11-21;0[89]:.*abc' file.gz
或者 awk (gawk in linux) 可以工作:
zcat *.gz | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null
重定向存在是因为一些 awk,尤其是 gawk,会抱怨 . 不是元字符