Linux设计处置Apache日记的Bash剧本仓酷云
要多动手,不要怕什么搞坏了怎么办,你不搞坏,不去动手,就永远不会有收获,既然你在linux中是自由的,那就发挥自己的权利;客岁一年,我写了快要100篇收集日记。
如今这一年停止了,我要统计"会见量排名",看看哪些文章最受接待。(盛大预报:本文开头处将发表前5名。)
<br>
以往,我用的是AWStats日记剖析软件。它能够天生很具体的报表,可是不太简单定制,得不到某些想要的信息。以是,我就决意本人写一个Bash剧本,统计服务器的日记,特地复习一下剧本常识。
现实证实,这件事比我料想的难。固然终极剧本只要20多行,但花了我整整一天,重复检察手册,确认用法和符合的参数。上面就是我的日记剖析剧本,固然它还不是通用的,可是我信任内里用到的命令,足以满意一样平常的日记剖析需求,同时也是很好的进修Bash的实例。假如上面的每个命令你都晓得,我以为能够可谓纯熟利用Bash了。
1、操纵情况
在先容剧本之前,先讲一下我的服务器情况。
我的收集服务器软件是Apache,它会对每个http哀求留下纪录,就像上面这一条:
203.218.148.99--"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
............
2、为何要用Bash
良多盘算机言语,都能够用来完成这个义务。可是,假如只是复杂的日记剖析,我以为Bash剧本是最符合的工具。
次要缘故原由有两个:一是"运转快",Bash是Linux原生程序,间接与内核交互,外生的注释性编程言语很难比它更快;二是"开辟复杂",Bash剧本的计划目标,就是为了处置输出和输入,特别是单行的文本,以是十分符合处置日记文件,各类现成的参数加上管道机制,能力无量,并且不必编译,间接运转,能够边改边试,对开辟十分友爱。
后面已说过,终极的剧本我只用了20多行,处置10GB的日记,20秒摆布就失掉了却果。思索到排序的伟大盘算量,如许的了局十分使人中意,充实证实了Bash的能力。
3、整体思绪
我的整体处置思绪是如许的:
第一步,处置单个日记。统计每天各篇文章的会见量。
第二步,天生月度排名。将每天的统计了局汇总,失掉月度会见量。
第三步,天生年度排名。将12个月的统计了局汇总,举行年度会见量的排序。
4、处置单个日记
以2011年1月1日的日记为例,它在目次2011-01当中,文件名是www-01.log,内里有10万条以下格局的纪录:
203.218.148.99--"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}www-01.log|grep-i^/blog/2011/.*.html$|sort|uniq-c|seds/^*//g>www-01.log.result
它用管道毗连了5个命令,每个都很复杂,我们顺次来看:
(1)awk$9==200{print$7}www-01.log
awk命令默许用空格,将每行文天职割成多少个字段。细心数一下,我们必要的只是第7个字段,即http哀求的网址,{print$7}暗示将第7个字段输入,了局就是:
/blog/2009/11/an_autobiography_of_yang_xianyi.html
思索到我们只统计乐成的哀求,因而再加一个限定前提,服务器的形态代码必需是200(暗示乐成),写成"$9==200",即第9个字段必需是200,不然不输入第7个字段。
更精密的统计,还应当辨别收集蜘蛛和实在会见者,因为我想不出复杂的分辩办法,这里只好疏忽了。
(2)grep-i^/blog/2011/.*.html$
在输入的一切纪录的第7个字段当中,并非每笔记录都必要统计的。依据我的文章的定名特性,它们的网址应当都以"/blog/2011/"开首,以".html"开头。以是,我用一个正则表达式"^/blog/2011/.*.html$",找出这些纪录。参数i暗示不辨别巨细写。
(3)sort
这时候,一切必要统计的纪录应当都列出来了,可是它们的序次是混乱的。接着,利用sort命令,不外目标不是为了排序,而是把不异的网址分列在一同,为前面利用uniq命令制造前提。
(4)uniq-c
uniq的感化是过滤反复的纪录,只保存一行。c参数的感化,是在每行的开首增加该纪录的呈现次数。处置以后的输入应当是如许的:
32/blog/2011/01/guidelines_for_english_translations_in_public_places.html
32/blog/2011/01/api_for_google_s_url_shortener.html
30/blog/2011/01/brief_history_of_arm.html
它暗示以上三篇文章,在1月1日的日记中,分离有32条、32条、30条的会见纪录(即会见次数)。
(5)seds/^*//g>www-01.log.result
上一步uniq命令增加的会见次数,是有前导空格的。也就是说,在上例的32、32、30之前有连续串空格,为了后续操纵的便利,这里把前导空格删往。sed命令是一个处置行文本的编纂器,s/^*//g是一个正则表达式(^和*之间有一个空格),暗示将行首的一连空格交换为空(即删除)。接着,将排序了局重定向到文件www-01.result。单个日记剖析就完成了。
5、月度汇总排名
经由上一步以后,1月份的31个日记文件,天生了31个对应的剖析了局文件。为了汇总全部月的情形,必需把这31个了局文件兼并。
(6)兼并剖析了局
foriinwww-*.log.result
do
cat$i>>log.result
done
这是一个轮回布局,把一切www-01.log.result情势的文件,都写进log.result文件。
然后,我用一行语句,盘算月度排名。
sort-k2log.result|uniq-f1--all-repeated=separate|./log.awk|sort-rn>final.log.result
这行语句由3个命令和1个awk剧本构成:
(7)sort-k2log.result
因为是31个文件汇总,log.result文件内里的纪录是无序的,必需用sort命令,将不异网址的纪录回类在一同。可是此时,会见次数是第一个字段,网址是第二个字段,因而参数k2暗示依据第二个字段举行排序。
(8)uniq-f1--all-repeated=separate
uniq的感化是过滤反复的纪录,参数f1暗示疏忽第一个字段(会见次数),只思索前面的字段(网址);参数暗示all-repeated=separate,暗示过滤失落一切只呈现一次的纪录,保存一切反复的纪录,而且每组之间用一个空行分开。这一步完成今后,输入了局酿成以下的情势:
617/blog/2011/01/guidelines_for_english_translations_in_public_places.html
455/blog/2011/01/guidelines_for_english_translations_in_public_places.html
223/blog/2011/01/2010_my_blogging_summary.html
253/blog/2011/01/2010_my_blogging_summary.html
不异网址都回在一组,组间用空行支解。为了简便,下面的例子每组只包括两笔记录,实践上每组都包括31笔记录(分离代表当月天天的会见次数)。
(9)log.awk剧本
为了将31天的会见次数加总,我动了良多头脑。最初发明,独一的办法就是用awk命令,并且必需另写一个awk剧本。
#!/usr/bin/awk-f
BEGIN{
RS=""#将多行纪录的分开符定为一个空行
}
{
sum=0#界说一个暗示总和的变量,初值为0
for(i=1;i<=NF;i++){#遍历一切字段
if((i%2)!=0){#判别是不是为奇数字段
sum+=$i#假如是的话,累加这些字段的值
}
}
printsum,$2#输入总和,前面跟上对应的网址
}
我已对下面这个log.awk剧本加了具体正文。这里再申明几点:起首,默许情形下,awk将"
"作为纪录的分开符,设置RS=""暗示改成将空行作为分开符,因而构成了一个多行纪录;其次,NF是一个awk的内置变量,暗示以后行的字段总数。因为输出文件当中,每行都包括两个字段,第一个是会见数,第二个是网址,以是这里做一个前提判别,只需是奇数字段就累加,偶数字段则一概跳过。最初,每一个纪录输入一个累加值和网址,它们之间用空格支解。
(10)sort-rn>final.log.result
对awk剧本的处置了局举行排序,sort默许利用第一个字段,参数r暗示逆序,从年夜往小排;参数n暗示以数值情势排序,不以默许的字典情势排序,不然会呈现10小于2的了局。排序了局重定向到final.log.result。至此,月度排名完成。
6、剧本文件
用一个剧本,包括下面两节一切的内容。
#!/bin/bash
ifls./*.result&>/dev/null#判别以后目次中是不是有后缀名为result的文件存在
then
rm*.result#假如有的话,删除这些文件
fi
touchlog.result#创立一个空文件
foriinwww-*.log#遍历以后目次中一切log文件
do
echo$i...#输入一行字,暗示入手下手处置以后文件
awk$9==200{print$7}$i|grep-i^/blog/2011/.*.html$|sort|uniq-c|seds/^*//g>$i.result#天生以后日记的处置了局
cat$i.result>>log.result#将处置了局追加到log.result文件
echo$i.resultfinished#输入一行字,暗示停止处置以后文件
done
echofinal.log.result...#输入一行字,暗示终极统计入手下手
sort-k2log.result|uniq-f1--all-repeated=separate|./log.awk|sort-rn>final.log.result#天生终极的了局文件final.log.result
echofinal.log.resultfinished#输入一行字,暗示终极统计停止
这就是月度排名的终极剧本。编写的时分,我假定这个剧本和log.awk剧本与日记文件在统一个目次中,并且这两个剧本都具有实行权限。
年度排名的处置与此相似,就不再赘述了。
=================================================================
关于剧本先容,就到此为止。
接上去,发表2011年度会见量最年夜的我的5篇文章。
第五名、《我的GoogleAdsense帐户被关》
<br>
我真想问问GoogleAdsense中国小组的成员:"岂非你们都是呆板人吗?岂非你们看不出来哪些是地痞网站,哪些是正直网站吗?你们是不是真的失职事情了,仍是在不卖力任地滥杀无辜?"
第四名、《乔布斯的告辞》
<br>
斯蒂夫·乔布斯在世的时分,对病情讳莫如深,外界对他的身材形态绝不知情。如今他作古了,依据各方面泄漏的信息,我们终究能够复原他的病历,懂得像他如许巨人如何看待生与逝世。
第三名、《Dan企图:从头界说人生的10000个小时》
<br>
在此之前,他几近没有打太高尔夫球,乃至对这项活动都没有太年夜乐趣。他的企图是,告退今后,天天实习6个小时,一周实习6天,保持6年,总计凌驾10000个小时,然后成为职业选手。他把这称为"Dan企图"。
第二名、《坚持复杂----怀念丹尼斯•里奇(DennisRitchie)》
<br>
13岁的丹尼斯•里奇(DennisRitchie),就如许跟着父亲一同离开新泽西。当时,谁也没有想到,这个娴静的少年将在这里待上一生,而且制造出改动天下的创造。
第一位、《人生只要900个月》
<br>
你能够画一个30x30的表格,一张A4纸就够了。每过一个月,就在一个格子里打钩。你全体的人生就在这张纸上。你会因而有一个明晰的观点:你的人生是怎样蹉跎的。
(完)
当你经过一段时间的学习后就应该扩充自己的知识,多学习linux命令,但是不要在初学阶段就系统的学习linux命令。 主流Linux发行版都自带非常详细的文档(包括手册页和FAQ),从系统安装到系统安全,针对不同层次的人的详尽文档,仔细阅读文档后40%问题都可在此解决。 目前全球有超过一百多个Linux发行版本,在国内也能找到十几个常见版本。如何选择请根据你的需求和能力,RedhatLinux和DebianLinux是网络管理员的理想选择。 要增加自己Linux的技能,只有通过实践来实现了。所以,赶快找一部计算机,赶快安装一个Linux发行版本,然后进入精彩的Linux世界,相信对于你自己的Linux能力必然大有斩获。 硬盘安装及光盘安装,清楚了解安装Linux应注意的有关问题,如安装Linux应在最后一个分区内,至少分二个分区。 如果上面的措施没有解决问题,此时你就需要Linux社区的帮助了。 Linux的使用者一般都是专业人士,他们有着很好的电脑背景且愿意协助他人。 未来的学习之路将是以指数增加的方式增长的。从网管员来说,命令行实际上就是规则,它总是有效的,同时也是灵活的。 再次,Linux是用C语言编写的,我们有学习C语言的基础,读程序和编写代码方面存在的困难小一点,也是我们能较快掌握的原因之一。? Linux最大的特点就是其开源性,这一点是十分难得的,这也是它能够存在到现在的原因之一。 应对Linux的发展历史和特点有所了解,Linux是抢占式多任务多用户操作系统,Linux最大的优点在于其作为服务器的强大功能,同时支持多种应用程序及开发工具。
页:
[1]