1. 程式人生 > >awk命令使用經驗

awk命令使用經驗

開發 文件中 ron 正則表達 特定 文件的 時間 class 現在

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命令使用經驗