linux文本分析利器awk


轉 快速理解linux文本分析利器awk

原文鏈接 杜亦舒 性能與架構 

awk是什么


如果工作中需要操作linux比較多,那么awk是非常值得學習的


awk是一個極其強大的文本分析工具,把文件逐行的讀入,以指定分隔符將每行切片,切開的部分再進行各種分析處理


可以使用awk創建程序,來讀取輸入文件、為數據排序、處理數據、對輸入執行計算以及生成報表,還有很多其他的功能


awk使用示例


通過一些簡單的示例來認識一下awk


(1) ll | awk '{print $9}' 


這個命令的結果是只顯示文件名列表


工作過程


awk命令接收 ll 結果信息,並逐行處理

對每一行結果記錄按空格(空格是默認分隔符)分割,並打印出第9列的信息


語法說明


單引號('')里面的部分是awk要執行的內容,花括號({})中是一個代碼塊,單引號中可以有多個花括號部分


print是一個輸出命令


$9 表示分割結果中的第9列內容,分割結果相當於一個數組,從 0-n,$0 是沒分割的整行內容,$n 是分割后的第 n 列內容


(2)awk -F ':' '{print $1"\t"$6}' /etc/passwd


上個命令是通過管道處理命令結果


這個命令是處理文件(/etc/passwd)的內容,顯示出用戶名、用戶目錄列表


passwd文件中每行內容是用 ':' 分隔的,要使用 -F 參數來指定分隔符


awk命令的尾部跟上文件名,就表示要處理這個文件


$1"\t"$6 是組織結果信息顯示形式,第1列內容 + tab + 第6列內容


(3)awk -F: '/root/{print $0}' /etc/passwd


上兩個命令是處理每一行記錄,如果想過濾出自己關注的記錄,可以使用匹配模式


這個命令就是對每行進行匹配,如果這一行信息中含有 root,才執行后面{}中的命令


雙斜杠(/.../)中支持正則表達式,例如匹配以 root 開頭的行


awk -F: '/^root/{print $0}' /etc/passwd


(4)awk -F ':' '{print "filename:" FILENAME ",linenumber:" NR ",columns:" NF ",linecontent:"$0}' /etc/passwd


awk還內置了一些有用的變量,例如這個命令中打印出了


‘文件名’ - FILENAME

‘行號’ - NR

‘列號’ - NF


(5)awk -F ':' 'BEGIN {print "header"} {print $1} END {print "foot"}' /etc/passwd


這個命令中多了兩個新部分:


BEGIN {print "header"}

END {print "foot"}


BEGIN 是開始處理前的動作,END 是處理后的動作


工作流程


1)先執行BEGING


對應此例中的 BEGIN {print "header"}


2)讀取文件,取得第一行進行分割,然后執行動作,對應此例中的 {print $1},直至處理完每一行


3)執行END操作


對應此例中的 END {print "foot"}


(6)ls -l |awk 'BEGIN {size=0;} {size=size+$5;} END{print size/1024/1024,"M"}'


此命令統計文件夾下的文件總大小,以M為單位


此例中新增了一個概念:變量


在起始部分 BEGIN {size=0;} 中,定義了一個變量,名為 size,初始化為 0


在每行對應的處理動作為 {size=size+$5;},對size變量值進行累加


在結束部分 END{print size/1024/1024,"M"} 中,對 size 值轉換為M,然后打印出來


(7)ls -l |awk 'BEGIN {size=0;} {if($5!=4096){size=size+$5;}} END{print size/1024/1024,"M"}'


此命令在上個例子的基礎上過濾掉了文件夾的大下


過濾是通過條件判斷來實現的,文件夾的大小為 4096


awk中的條件語句是從C語言中借鑒來的,支持 if、while、do/while、for、break、continue


---


通過上面的幾個例子,已經可以看到awk的概貌,也可以理解了為什么awk這么強大,它有內置變量、可以自定義變量、支持條件判斷語句、支持正則表達式…… 可以視為一門語言了


awk還有很多其他高級用法,有興趣的話可以深入學習一下


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM