0

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

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

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

4

3 回答 3

2

由于您只想计算出现次数,因此您可能只需简单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 兼容正则表达式。

于 2013-11-23T18:21:04.013 回答
1

尝试这个 :

zgrep -c '2013-11-21;0[89]:.*abc' file.gz
于 2013-11-23T19:53:06.693 回答
0

或者 awk (gawk in linux) 可以工作:

zcat *.gz  | awk -F'[\.;:]' '{arr[$2]++} END{for(i in arr){print i, arr[i]} }' 2>/dev/null

重定向存在是因为一些 awk,尤其是 gawk,会抱怨 . 不是元字符

于 2013-11-23T18:28:57.083 回答