需要为特定单词grep文件并计算每小时的发生次数

时间:2017-03-21 10:18:13

标签: shell

我有一个日志文件如下:

127.0.0.1 - - [09/Mar/2017:22:59:49 -0500] "GET /file/name/keyword HTTP/1.0" 200 59 1
127.0.0.1 - - [09/Mar/2017:22:59:53 -0500] "GET /file/name/keyword HTTP/1.0" 200 59 2
127.0.0.1 - - [09/Mar/2017:22:59:54 -0500] "GET /file/name/keyword HTTP/1.0" 200 59 1
127.0.0.1 - - [09/Mar/2017:22:59:58 -0500] "GET /file/name/keyword HTTP/1.0" 200 59 0
127.0.0.1 - - [09/Mar/2017:22:59:59 -0500] "GET /file/name/keyword HTTP/1.0" 200 59 1

我想grep日志以获取某个关键字并每小时计算一次。

需要获取当前时间并减去1以获取前一个小时及其中的发生次数通过shell脚本邮寄

1 个答案:

答案 0 :(得分:0)

uniq -c只做prefix lines by the number of occurrences,这意味着这些行应该完全相同。您可以使用sed使您的专线只包含DD/MMM/YYYY:HH等时间信息,然后使用uniq -c来计算。

我使用你的样本数据并将最后2行调整到不同的小时,然后使用此命令得到如下结果。前缀号32是每小时的计数。 cat test.log | grep keyword | sed 's/.*\[\(.*[0-9]\{4\}:[0-9]\{2\}\).*\].*/\1/g' | uniq -c 3 09/Mar/2017:22 2 09/Mar/2017:23

如果您只想要上一小时的计数,请尝试以下方法: cat test.log | grep keyword | grep $(date --date="@$(($(date +%s) - 3600))" "+%d/%b/%Y:%H") | wc -l 首次使用date +%s将当前时间转换为自1970-01-01 00:00:00 UTC后的秒数,然后减去3600秒,并将结果设置回date进行格式化,grep日期和计数行。

希望它有所帮助。