我正在解析我的 httpd 访问日志,以找出我们的 Google 设备的哪些抓取工具正在轰炸我的网络服务器以及何时轰炸。如果我输入以下命令:
grep google /path/to/access_log | awk '{print $4, $14}'
我可以得到一个非常大的(就像我说的,他们正在轰炸我)返回集,每秒至少 4 个。我希望能够按时间戳对上面列出的结果集进行分组,并返回一个与每秒命中次数内联的字符串。所以理想情况下,我希望有类似于
04/Aug/2011:15:56:16 Crawler1 6
04/Aug/2011:15:56:16 Crawler2 10
04/Aug/2011:15:56:17 Crawler1 8
04/Aug/2011:15:56:18 Crawler1 12
第一个是时间戳,第二个是第 14 个字段,即 Google 爬虫的 ID,第三个是计数。列的顺序无关紧要。
答案1
awk '/google/ { print substr($4, 2, length($4)-1), $14 }' access_log | sort -rn | uniq -c | awk '{ print $2"\t"$3"\t"$1 }'
答案2
这可以在单个 awk 中完成,使用数组计算同一秒内的命中次数,但如果没有示例输入,则很难进行测试。让我们猜一下:
awk '/google/ {
ts=$4
crawler=$14
if (ts != lts) {
for(c in count) {
print lts " " c " " count[c]
delete count[c]
}
lts=ts
}
count[crawler]++
}END{
for(c in count) {
print lts " " c " " count[c]
}
}' access_log