在七月中的時候曾經寫過一篇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. 程式 以往的做法會宣...
-
雖然到最後你還是沒留下你的名字... 今天就來介紹一下,如何用程式撰寫多維 矩陣乘法運算 首先要了解一下矩陣乘法的計算方式 (m1 x n1) * (m2 x n2) 結果會是 (m1 x n2)的矩陣 上例中的 n1 = m2 矩陣乘法位置互換結果就會不同 (大家可以直接點上方...
-
最近處理了一個 Session 變數會莫名消失的問題,麻煩的地方在於,這個舊系統在.NET 1.1的環境上活的很愉快,但是努力升級到.NET 2.0之後,在 某些狀況 下 Session 變數就會莫名的消失,導致權控子系統判斷為 Session Timeout,而將...
沒有留言:
張貼留言