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

我试图从我的apache日志文件中获得一些意义:我想parsing我的访问日志,并有一些关于200 status code命中(每个命中多less次)的统计信息。

所以我试着学习一些awk的魔法,在这里我现在得到了:

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

这是我要做的大部分事情:从access.log中select以200次命中结束的所有日志条目,然后select与生成的命中path对应的部分,对它们进行sorting,对每个唯一元素进行计数并根据数字进行sorting这个独特元素被击中的时代。

所以结果如下所示:

  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 ,我想获得统计所有这些统计。 我find的唯一的解决scheme是使用grep "my 200 expression" -R /pathToDirWithLogs这将grep目录中的所有文件,这显然是不好的,因为它不仅会logginggrep。 列出文件也不是一个选项,因为我不知道数字N.
  • 我真的不关心/ public / img / upload /中的每个单独的文件,我只关心其中有多less人被击中。 在这里,我完全迷失了,不知道如何开始。 但这里是我想要我的简单输出的一个例子11 /public/img/upload/* 18 /public/js/main.js 33 / 236 /index.html

这里public / img / upload表示在这里生成的所有命中:来自image_1的8个,来自image_2的2个和来自image_3的1个。

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

grep命令(与许多实用程序一样)将接受shell globbing提供的多个文件

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

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

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

澄清这个要求可能会导致一个解决scheme,但你应该花一些时间来决定你想要什么,然后自己去。

你也可能对awstats感兴趣。