使用 awk 和 grep 从 apache 日志中获取一些含义

使用 awk 和 grep 从 apache 日志中获取一些含义

我试图从我的 apache 日志文件中获取一些含义:我想解析我的访问日志并获得一些有关200 status code点击次数的统计数据(每个点击次数有多少)。

因此我尝试学习一些 awk 魔法,下面是我现在得到的结果:

grep "HTTP/1.1\" 200" access.log | awk '{print $7 } ' | sort | uniq -c | sort -n

它完成了我想要的大部分事情:它从 access.log 中选择出所有命中次数达到 200 的日志条目,然后选择与命中生成的路径相对应的部分,对它们进行排序,计算每个唯一元素的数量,并根据命中该唯一元素的次数进行排序。

结果如下:

  1 /public/img/upload/image_3.jpg
  2 /public/img/upload/image_2.jpg
  8 /public/img/upload/image_1.jpg
 18 /public/js/main.js
 33 /
236 /index.html

我正在尝试进一步推动它:

  • 因为我有 logrotate,所以我还有许多其他类似的文件access.log.1, ..., access.log.N,我想获取所有这些文件的统计数据。我发现的唯一解决方案是使用grep "my 200 expression" -R /pathToDirWithLogs将 grep 目录中的所有文件,这显然不太好,因为它不仅会 grep 日志。列出文件也不是一种选择,因为我不知道 N 的数量。
  • 我并不真正关心 /public/img/upload/ 中的每个文件,我只关心其中有多少个被选中。我完全不知所措,不知道如何开始。但这里有一个示例,我想要我的简单输出 11 /public/img/upload/* 18 /public/js/main.js 33 / 236 /index.html

这里 public/img/upload 代表在那里生成的所有命中:8 次来自 image_1,+2 次来自 image_2,1 次来自 image_3。

有没有 awk、grep 魔术师来给我指路?

答案1

grep命令(像许多实用程序一样)将接受 shell 提供的多个文件通配符所以

grep -h "HTTP/1.1\" 200" /path/to/log/dir/access.log*

(或类似的)应该在这方面做你想做的事情。

您的问题的第二部分不清楚——我们怎么知道您对 中的单个文件不感兴趣,但您对和/public/img/upload中的单个文件感兴趣,但显然不感兴趣。/public/js//index.html

澄清这个要求可能会带来解决方案,但你应该花一些时间决定你想要什么,然后自己尝试一下。

您也可能对。。。有兴趣统计信息

相关内容