处理Apache日志的Bash脚本

2019-01-26 14:57

处理Apache日志的Bash脚本

作者: 阮一峰 日期: 2012年1月 6日

去年一年,我写了将近100篇网络日志。

现在这一年结束了,我要统计\访问量排名\,看看哪些文章最受欢迎。(隆重预告:本文结尾处将揭晓前5名。)

以往,我用的是AWStats日志分析软件。它可以生成很详细的报表,但是不太容易定制,得不到某些想要的信息。所以,我就决定自己写一个Bash脚本,统计服务器的日志,顺便温习一下脚本知识。

事实证明,这件事比我预想的难。虽然最终脚本只有20多行,但花了我整整一天,反复查看手册,确认用法和合适的参数。下面就是我的日志分析脚本,虽然它还不是通用的,但是我相信里面用到的命令,足以满足一般的日志分析需求,同时也是很好的学习Bash的实例。如果下面的每一个命令你都知道,我觉得可以堪称熟练使用Bash了。

一、操作环境

在介绍脚本之前,先讲一下我的服务器环境。

我的网络服务器软件是Apache,它会对每一个http请求留下记录,就像下面这一条:

203.218.148.99 - - [01/Feb/2011:00:02:09 +0800] \

/blog/2009/11/an_autobiography_of_yang_xianyi.html HTTP/1.1\

\nomics.html\\(Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13\

它的意思是2011年2月1日,IP地址为203.218.148.99的访

问者,向服务器请求访问网址

/blog/2009/11/an_autobiography_of_yang_xianyi.html。

当天所有的访问记录,组成一个日志。过去一年,一共生成了365个日志文件。它们存放在12个目录中,每一个目录表示一个月(2011-01、2011-02、......2011-12),里面的日志文件依次为www-01.log、

www-02.log、......www-31.log(假定该月有31天)。 在不压缩的情况下,365个日志文件加起来,要占掉10GB空间。我的目标就是分析这10GB日志,最后得到一个如下形式的访问量排名: 访问量 网址1 访问量 网址2 访问量 网址3 ...... ...... 二、为什么要用Bash

很多计算机语言,都可以用来完成这个任务。但是,如果只是简单的日志分析,我觉得Bash脚本是最合适的工具。 主要原因有两个:一是\开发快\,Bash脚本是各种Linux命令的组合,只要知道这些命令怎么用,就可以写脚本,

基本上不用学习新的语法,而且它不用编译,直接运行,可以边写边试,对开发非常友好。二是\功能强\,Bash脚本的设计目的,就是为了处理输入和输出,尤其是单行的文本,所以非常合适处理日志文件,各种现成的参数加上管道机制,威力无穷。

前面已经说过,最终的脚本我只用了20多行,处理10GB的日志,20秒左右就得到了结果。考虑到排序的巨大计算量,这样的结果非常令人满意,充分证明了Bash的威力。

三、总体思路

我的总体处理思路是这样的:

第一步,处理单个日志。统计每一天各篇文章的访问量。

第二步,生成月度排名。将每一天的统计结果汇总,得到月度访问量。

第三步,生成年度排名。将12个月的统计结果汇总,进行年度访问量的排序。 四、处理单个日志

以2011年1月1日的日志为例,它在目录2011-01之中,文

件名是www-01.log,里面有10万条如下格式的记录: 203.218.148.99 - - [01/Feb/2011:00:02:09 +0800] \

/blog/2009/11/an_autobiography_of_yang_xianyi.html HTTP/1.1\

\nomics.html\\(Windows; U; Windows NT 5.1; zh-TW; rv:1.9.2.13) Gecko/20101203 Firefox/3.6.13\

处理这个日志,我只用了一行代码:

awk '$9 == 200 {print $7}' www-01.log | grep -i '^/blog/2011/.*\\.html$' | sort | uniq -c | sed 's/^ *//g' > www-01.log.result

它用管道连接了5个命令,每一个都很简单,我们依次来看:

(1) awk '$9 == 200 {print $7}' www-01.log awk命令默认用空格,将每一行文本分割成若干个字段。仔细数一下,我们需要的只是第7个字段,即http请求的网址,{print $7}表示将第7个字段输出,结果就是:


处理Apache日志的Bash脚本.doc 将本文的Word文档下载到电脑 下载失败或者文档不完整,请联系客服人员解决!

下一篇:b5我收藏的2011-2012学年八年级生物第一学期半期联考试卷 人教新

相关阅读
本类排行
× 注册会员免费下载(下载后可以自由复制和排版)

马上注册会员

注:下载文档有可能“只有目录或者内容不全”等情况,请下载之前注意辨别,如果您已付费且无法下载或内容有问题,请联系我们协助你处理。
微信: QQ: