看到老男孩老师的blog所相当到的---关于数组(shell)

看到老男孩老师的blog所相当到的---关于数组(shell)

      今天看到了老男孩老师的一篇博文,有所思考,所以记录一下!

      老师的blog的原文:http://oldboy.blog.51cto.com/2561410/909696

       老师这么强大,这么好的东西拿出来都与人分享,自己肚子那点油水还藏着掖着,没什么意义。故拿出来��鹛�阳。希望能有所收获!

      

6 【实战解决案例】

说了这么多了,都是理论,再给个案例吧【摘自老男孩Linux培训-shell培训教案中的例子】,这里要特别感谢白开水兄弟给予的支持。

下面的例子适合于网站流量很高,但是,还没达到全网瘫痪的严重地步时的解决方案,适合我们自己的IDC机房及CDN业务(如果是CDN,那么,分析处理可以交给CDN,自己下载CDN日志分析也可)。

范例7:分析图片服务日志,把日志(每个图片访问次数*图片大小的总和)排行,取top10,也就是计算每个url的总访问大小

说明:范例7的生产环境应用:这个功能可以用于IDCCDN网站流量带宽很高,然后通过分析服务器日志哪些元素占用流量过大,进而进行优化裁剪该图片(见老男孩发布的《淘宝的双十一超大流量应对文章点评》),压缩js等措施。

本题需要输出三个指标: 【访问次数】    【访问次数*单个文件大小】   【文件名(可以带URL)】

解答

测试数据

59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:43:56 +0800] "GET /static/images/photos/2.jpg HTTP/1.1" 200 11299 "http://oldboy.blog.51cto.com/static/web/column/17/index.shtml?courseId=43" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

59.33.26.105 - - [08/Dec/2010:15:44:02 +0800] "GET /static/flex/vedioLoading.swf HTTP/1.1" 200 3583 "http://oldboy.blog.51cto.com/static/flex/AdobeVideoPlayer.swf?width=590&height=328&url=/[[DYNAMIC]]/2" "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727; .NET CLR 3.0.4506.2152; .NET CLR 3.5.30729)"

124.115.4.18 - - [08/Dec/2010:15:44:15 +0800] "GET /?= HTTP/1.1" 200 46232 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"

124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/jquery.lazyload.js HTTP/1.1" 200 1627 "-" "-"

法一:通过两个数组来计算

因为我们要的最终结果是某个文件的访问次数和消耗的流量,所以考虑建立以文件名为索引的两个数组,一个存储访问次数,一个保存消耗的流量,这样当使用awk按行遍历文件时,对次数数组+1,同时对流量数组进行文件大小的累加,等文件扫描完成,再遍历输出两个数组既可以得到该文件的访问次数和总的流量消耗。

[root@locatest scripts]# awk '{array_num[$7]++;array_size[$7]+=$10}END{for(x in array_num){print array_size[x],array_num[x],x}}' access_2010-12-8.log |sort -rn -k1|head -10 >1.log

   ---------------------分割线-----------------------------------分割线------------

这里面有些东西自己琢磨了一下, 首先理清一下 

    1、END 是awk的模式一种,是读取数据后的操作,与此类似的还有BEGIN,是读取数据之前的操作。需要记住的是一个是这个关键词需要大写,另外还是记住的是它的操作模式,是读取数据的前后顺序。这个是张磊师兄告诉我的!

    2、这个array_num 和array_size 分别是代表访问次数和访问次数*单个文件大小。里面有个小问题不是明白,array_num[7] 我觉得不是7,因为[7]是文件名的话自加,是格式,相同的文件名自加,这样文件名个数出来了。在/static/images/photos/2.jpg 后面这个空格的格式是7,它的索引应该是6,因为第一个元素是0开始,第n个元素的索引是n-1是6.  然后是处理11299,这个是文件的大小,把它赋值文件名 [7],然后这个文件名去+1 。

    3、今天问问同事,他说[$7] 这样算,按照空格两边都算上,从1开始,比如:

下面:  空格的两边都算上从1开始

124.115.4.18 - - [08/Dec/2010:15:44:25 +0800] "GET /static/js/web_js.js HTTP/1.1" 200 4460 "-" "-"

       1             2 3                  4                       5           6       7                              8               9       10     11  12

   

 

 

你可能感兴趣的:(关于数组)