awk命令使用經驗
1.為什麽要使用awk
舉一個簡單的例子,作為一個java開發人員,在查看日誌服務器(即時保存所有線上環境的日誌)上的日誌的時候,由於部署了服務的服務器不止一臺,當想要查找某一個特定信息的時候,由於不清楚該特定信息在那臺服務器上,所以一般都是全量的搜的
比如
grep ‘specialInfo‘ /project/myApplication/10.*/log/info.log
或者想要追蹤是否某一臺服務器才產生某信息時
tail -f /project/myApplication/10.*/log/info.log |grep ‘specialInfo‘
好的,現在我們能找到具體的這個信息出現時的日誌了。
但是,這個日誌是在哪個ip的服務器上啊....
簡單的命令這時候好像不能滿足這個需求。而產生線上問題的時候,往往時間都很寶貴,需要迅速定位問題的原因以及問題的影響
所以我覺得掌握一些能夠快速篩選日誌的手段還是很有必要的
而awk則是對日誌這個具有規則的文本進行篩選的一個很好的手段
2.awk基礎
awk 支持以制定的分隔符將一行文本切成多段 默認是使用空格作為分隔符 也可以通過-f命令來進行替換 例如awk -f, 則以逗號作為分隔符
分隔後的文本可以用符號來表示 $0 表示整行 $1表示分割後的第一段文本 $2表示第二段 依次類推,
NF是代表該行的數量 那麽用NF-1就能取到倒數第二列
以上是最基礎的,那麽接下來我們想找一下第二列大於15的行的第三列 兩種方式都可以起到過濾的作用
awk中 如果用BEGIN{命令1}{命令2}{命令3}End{命令4}的話 1會首先執行,2和3 會對每行輸入執行,4則會最會執行
命令是以花括號來分隔的,可以進行嵌套 下面的 BEGIN{{命令1}{命令2}}
再來一個比較有用的 awk -v 可以設置變量 下面就是當第二列大於15的時候 i會增加1 每行都打印
正則表達式
~ \regex\ ~! \regex\
~是包含 ~! 是不包含
再來個統計
sum 下面利用sum數組 統計第一列都有哪幾種,出現了幾次
awk還有很多其他的功能,以後用到了再在這個補充,基礎部分我就簡單寫這麽一點
3.awk實際應用
有了上面的基礎,解決1中的問題就很簡單了
1、tail -f 多個文件時查看文件的具體路徑
tail -f 多個文件時,在切換文件的時候會首先打印 ==> fileName<==
那麽就利用這一點
tail -f ../project/myApp/10.*/log/cron.log |awk ‘$1 ~/==>/{i=$2} {print $0"--------"i}‘
上面這行命令就是在輸出中定義一個變量 i 然後當行裏面有==>時,將文件路徑保存在i中, 然後打印每一行的內容,後綴加上文件名,這樣每當切換文件的時候i就會更新,就能夠實現功能
2、cat 多個文件的時候查看文件的路徑 和上面的類似,直接讀內聯變量FILENAME 就可以了,grep繼續查找要找的內容
awk ‘{i=FILENAME} {print $0"--------"i}‘ ../project/facrm.ms.netease.com/10.*/log/*.log |grep find
3、查找某個文件中包含某個字符串 且不包含某個字符串 並統計這種的數量
判斷第一列包含1然後所有行不包含6 統計整列出現的次數
awk ‘{if($1 ~/1/){if($0 ~! /6/){sum[$0]++}}}END{for(i in sum){print i,sum[i]}}‘ test
這種感覺存著比較好,之後稍微改改直接用,之後有業務場景了在補充啦
awk命令使用經驗