如何按时间戳对返回字符串进行分组并显示每组有多少个命中

如何按时间戳对返回字符串进行分组并显示每组有多少个命中

我正在解析我的 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

相关内容