在七月中的時候曾經寫過一篇AWStats 重新分析特定時段 log 的方法,當時是第一次遇到 AWStats 報表執行失敗的問題,很不幸的後來又陸續遇到幾次需要重跑 AWStats 報表的需求。原本是參考Neo's Blog - awstats 加入/重新計算分析某時段的方法,老老實實的手動去修改 AWStats 統計資料檔中的「LastLine」、「LastTime」、「LastUpdate」三個參數,但由於我要計算的報表多達 26 個,連續 26 次用 vi 去編輯統計資料檔中的三行資料不但累人,而且很容易出錯!經過一番摸索,終於利用三個指令就把 26 個檔案中的資料一次修改完成!
其實這次用到的技巧跟前陣子分享的[Shell Script] 批次修改使用者的密碼有效期限 - V2差不多,主要是利用 xargs -i 來濃縮大量、只有一個參數不同的指令。這次要用到的指令範例如下:
批次將 26 個 AWStats 統計資料檔的 LastTime 修改為「LastTime 20100630000000」:
find /path/to/awstats/statistic/files -name awstats122010* | xargs -i sed -i '/^LastTime/c LastTime 20100630000000' {}
首先利用 find 指令找出要修改的月份的所有統計資料檔(-name 參數支援 Regular Expression),此例是要找出2010年12月的檔案。因為 find 的結果會是完整的檔案路徑(e.g., /etc/fstab),因此可作為 sed 指令的參數,用以指定要修改的檔案。
下一步是利用 sed -i 指令來編輯檔案,在此也支援 Regular Expression,因此「^LastTime」就是以「LastTime」開頭的那一行文字,這裡的「^」很重要,表示這一行文字的開頭第一個字就是「L」,若去掉「^」,則會一併編輯到「#LastTime」的註解文字。
找到 LastTime 開頭的那行文字以後,「c」表示整行取代,因此「c」後面接的就是我們想要這行變成怎樣的最後內容:「LastTime 20100630000000」(不一定要指定成2010年6月30號,只要日期比今天更早就可以了)。
最後最重要的就是「{}」了,xargs -i 會把 find pipe 過來的完整檔案路徑代入「{}」中(一次代入一個檔案),因此就看 find 指令可以找到多少檔案(以我的例子來說是 26 個),這行指令就可以一次修改多少檔案中的「LastTime」的內容了!
接下來要編輯「LastLine」和「LastUpdate」的內容就很簡單了:
find /var/lib/awstats/ -name awstats122010* | xargs -i sed -i '/^LastLine/c LastLine 20100630000000 0 0 0' {}
find /var/lib/awstats/ -name awstats122010* | xargs -i sed -i '/^LastUpdate/c LastUpdate 20100630000000 0 0 0 0 0' {}
學會 xargs -i 以後真的是太好用了,很快就越用越上手,想忘也忘不掉啦!
訂閱:
張貼留言 (Atom)
Google Spreadsheet 裡用規則運算式
最近因為工作關係,遇到要用 Google Form 及 Google Sheet 所以研究了 Google Sheet 裡的一些 function 怎麼用 首先,分享一下如何在 Google Sheet 裡用規則運算 :D
-
今天坎尼去上課老師講了一題很有趣的題目 所以回到家坎尼就順手試驗了一下 I. XOR (exclusive OR) XOR 是邏輯運算子之一,定義為: 當兩數的值不同才為 true,相同則為 false 其他相關說明可以參考 維基百科:XOR II. 程式 以往的做法會宣...
-
好久沒開 Chart Control 議題了 剛好前陣子 Codeplex 出現可以輕鬆建立 Excel 檔案的 Library- NPOI 於是坎尼想說研究一下,看能不能把 Chart Control 匯出圖片到 Excel 中 沒想到只花了不到1小時就研究...
-
上個週末打開一個影片檔,發現字幕檔是中英文混合的,造成字幕吃掉畫面很大的空間, 打開字幕檔一看,果然每一段時間都有先英文後中文的字幕: 因此我想要自己作成「只有中文」&「只有英文」兩個字幕檔,但這個檔案有6418 行,如果要手動一行一行的刪除...
沒有留言:
張貼留言