awk編程初級篇

awk是一種非常優秀的文本處理語言,尤其對於日誌分析及報表處理。本文將對自己學習awk的一些經驗分享給大家。
初識awk
$ awk '{print}' 2012_02_02.request.log  ---- 該命令將2012_02_02.request.log文件中的內容輸出。
$ awk '{print $0}' 2012_02_02.request.log ---- 與上述命令完全一樣,用於輸出該文件的內容。$0命令表示當前行。
$ awk '{print ""}'  /etc/passwd ---- 輸出空格
$ awk '{print ”helloworld"}' /etc/passwd  ---- 將在每行都輸出helloworld

多個字段
awk善於處理分成多個邏輯字段的文本,而且可以方便的引用到分解完後的各個字段的數據。
$ awk -F":" '{print $1}' /etc/passwd  ---- 按照:進行分割,並輸出分割後的第一個值;
-F ---- 表示按照某個字符進行分隔;
$ awk -F":" '{print $1 $3}' /etc/passwd ---- 按照:進行分割,輸出分割後的第1個值及第3個值,值與值之間是相連的。
$ awk -F":" '{print $1" "$3}' /etc/passwd ---- 按照:進行分割,輸出分割後的第1個值及第3個值,而且值與值之前有空格分隔。
$ awk -F":" '{print "username:" $1 "\tuid:"$3}' /etc/passwd  ---- 按照:進行分隔,輸出第1個值及第3個值,在輸出時加入一些內容。

外部腳本
當然有時直接在屏幕上輸入多行命令會較爲複雜,我們可以通過編程的方式將awk的一些命令集寫在一個文件中通過外部調用的方式來完成多條複雜命令的執行,完成相關的功能。外部腳本的引用通過:
$ awk -f ****.awk myfile.data
-f表示調用外部腳本並執行。

BEGIN和END塊
awk會執行每個編程塊一次,當然有時候在處理文本之前可能需要先對文本進行處理,可以將預先需要的處理放置在BEGIN塊中;或者在文本處理完成後,需要輸出統計結果,則可以將輸出結果放置在 END塊中。如
BEGIN {            END {
    FS=":";            print count;
}                       }   

規則表達式 -- / /
awk允許使用規則表達式,根據規則表達式是否匹配當前行來選擇執行獨立代碼塊。
/root/ '{print}' ---- 當該行中含有root這個關鍵詞時才匹配輸出;
它還提供了一些特殊的匹配方式,如"==", "<", ">", "<=", ">=", "!=", "~", "!~"
其中"~"與"!~"分別表示匹配與不匹配。即運算符左邊的變量是否包含右邊規則表達式中的值。
$ awk -F":" '{if($1 ~ /root/) print}' /etc/passwd ----表示的是按:分隔後的第一個字符串中包含root字符串的再輸出
$ awk '{if($0 == /^$/) ++count}  END {print count}' /etc/passwd ---- 輸出該文件中含有多少個空白行。

字段分隔符 -- FS
在前面介紹過程中,有了解到可以通過-F":"的方式來設置當前字段的分隔符。當然也可以採用其它的方式來進行設置,如:
FS = ":" ----通過FS也可以方便的進行設置;
FS = "\t+" ----通過FS配置規則表達式的方式也可以進行分隔,如上述即通過一個或多個tab空白進行分割。

字段數量 -- NF
對於一個統計文本,由於其中按照某個分割符分開後,其字段數並不確定,通過NF命令即可統計出每行含有多少個字段數量。
$ awk '{print NF}' /etc/passwd ---- 輸出該文本中所包含的每條記錄按空格分割後的字段數量;

記錄號 -- NR
包含當前記錄的編號(將第一條記錄算做記錄號1)。NR還會告訴你當前的行號。
$ awk '{if(NR > 1 && NR <=20) print}' /etc/passwd ---- 輸出該文本中2-20行的所有記錄。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章