轉 快速理解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還有很多其他高級用法,有興趣的話可以深入學習一下
