我有一个日志文件如下:
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脚本邮寄
答案 0 :(得分:0)
uniq -c
只做prefix lines by the number of occurrences
,这意味着这些行应该完全相同。您可以使用sed
使您的专线只包含DD/MMM/YYYY:HH
等时间信息,然后使用uniq -c
来计算。
我使用你的样本数据并将最后2行调整到不同的小时,然后使用此命令得到如下结果。前缀号3
和2
是每小时的计数。
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
日期和计数行。
希望它有所帮助。