apache - 过滤 access.log 以返回唯一 IP 地址列表和每个客户端的成功请求数(代码 200)的有效方法是什么?

标签 apache bash scripting awk

我正在寻找一种获取 access.log 格式如下所示的方法

127.0.0.1 - frank [10/Oct/2000:13:55:36 -0700] "GET /apache_pb.gig HTTP/1.0" 404 201
127.0.0.1 - frank [10/Oct/2000:13:56:40 -0700] "GET /apache_pb.gif HTTP/1.0" 200 1406
127.0.0.1 - frank [10/Oct/2000:13:57:45 -0700] "GET /apache_pb.gif HTTP/1.0" 200 5325
127.0.0.1 - frank [10/Oct/2000:13:58:16 -0700] "GET /apache_pb.gif HTTP/1.0" 200 35292
127.0.0.3 - jerry [10/Oct/2000:13:59:12 -0700] "GET /apache_pb.gif HTTP/1.0" 200 863

并编写一个脚本来返回格式如下的结果:

127.0.0.1       3
127.0.0.3       1

脚本的规则很简单,它应该统计每个唯一IP地址记录成功访问请求(代码200)的次数。

我完全愿意在 bash 之外做这件事。我只是认为从那里开始使用 grep、sort 和 uniq 可能更容易。我遇到的主要问题是 uniq -c 的输出格式错误。 uniq 一直在像这样列出输出:

3  127.0.0.1
1  127.0.0.3

不幸的是,我不能拥有那个。非常感谢任何帮助。谢谢!

最佳答案

:

awk '$(NF -1) == 200 {arr[$1]++}END{for (a in arr) print a, arr[a]}' access.log

稍微分解一下:

  • $(NF -1) :awk 默认在空格(或制表符等)上拆分当前行,NF 是列数,所以 NF -1 是从右数第二列,我们测试它的值是否为 200
  • 如果是 200,则我们将 IP 地址作为键($1:第一列)递增关联数组 arr
  • @最后,我们打印每个成功的行

关于apache - 过滤 access.log 以返回唯一 IP 地址列表和每个客户端的成功请求数(代码 200)的有效方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20292951/

相关文章:

python - 从 Windows + Apache 上运行的 Django 应用程序调用时,Popen 不执行

bash - 从 bash 的新 Google Chrome 浏览器 session 中获取 "user agent"字符串

bash - set -e 和后台进程

JavaScript FF IE 更新 + 消息脚本问题

linux - 需要一个 shell 脚本,bzip2 的每个文件从某个文件夹递归

email - Cron 发送电子邮件时使用 STDERR 但不使用 STDOUT?

apache - 使用 mod_rewrite 重定向到 Apache 内置 404 页面?

apache - https 的 htaccess 文件错误 500

apache - 在 Apache Web 服务器中设置内容安全策略

linux - 使用 java_home 环境变量识别问题来源