看到老男孩老師的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

   

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章