如果您无法下载资料,请参考说明:
1、部分资料下载需要金币,请确保您的账户上有足够的金币
2、已购买过的文档,再次下载不重复扣费
3、资料包下载后请先用软件解压,在使用对应软件打开
处理Apache日志的Bash脚本HYPERLINK"http://www.bshare.cn/share"作者:HYPERLINK"http://www.ruanyifeng.com/"阮一峰日期:HYPERLINK"http://www.ruanyifeng.com/blog/2012/01/"2012年1月6日去年一年,我写了将近100篇网络日志。现在这一年结束了,我要统计"访问量排名",看看哪些文章最受欢迎。(隆重预告:本文结尾处将揭晓前5名。)以往,我用的是HYPERLINK"http://awstats.sourceforge.net/"AWStats日志分析软件。它可以生成很详细的报表,但是不太容易定制,得不到某些想要的信息。所以,我就决定自己写一个Bash脚本,统计服务器的日志,顺便温习一下脚本知识。事实证明,这件事比我预想的难。虽然最终脚本只有20多行,但花了我整整一天,反复查看手册,确认用法和合适的参数。下面就是我的日志分析脚本,虽然它还不是通用的,但是我相信里面用到的命令,足以满足一般的日志分析需求,同时也是很好的学习Bash的实例。如果下面的每一个命令你都知道,我觉得可以堪称熟练使用Bash了。一、操作环境在介绍脚本之前,先讲一下我的服务器环境。我的网络服务器软件是Apache,它会对每一个http请求留下记录,就像下面这一条:203.218.148.99--[01/Feb/2011:00:02:09+0800]"GET/blog/2009/11/an_autobiography_of_yang_xianyi.htmlHTTP/1.1"20084058"http://www.ruanyifeng.com/blog/2009/11/freenomics.html""Mozilla/5.0(Windows;U;WindowsNT5.1;zh-TW;rv:1.9.2.13)Gecko/20101203Firefox/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]"GET/blog/2009/11/an_autobiography_of_yang_xianyi.htmlHTTP/1.1"20084058"http://www.ruanyifeng.com/blog/2009/11/freenomics.html""Mozilla/5.0(Windows;U;WindowsNT5.1;zh-TW;rv:1.9.2.13)Gecko/20101203Firefox/3.6.13"处理这个日志,我只用了一行代码:awk'$9==200{print$7