AWK 介紹:一個報文格式化,從文本文件中抽取數據包的工具。
思維: 基於模式動作形式,在動作前指定特定的模式,使動作在記錄滿足模式時才執行。
基本概念:
1、模式和動作:
模式:即觸發動作的條件,模式部分決定動作何時觸發及觸發事件。
可以是:a 條件語句 if($4=="Green")
b 複合語句 and (&&)、 or(||)、!
c 正則表達式 awk '$0 ~/[Gg]reen/ {print $0}' grade.txt
動作:對數據進行的操作。 動作必須用{}括起來
2、域和記錄:
域:awk將標準輸入的每一行按照分隔符分成n個域,依次爲$1,$2,$3,…,$n
要輸出域採用print語句,輸出所有域使用$0.
判斷AWK語句錯誤的一些依據:
1)、確保整個awk命令用單引號括起來;
2)、確保命令內的所有引號成對出現;
3)、確保用花括號括起動作語句,用圓括號括起條件語句;
重點知識點:
1、AWK輸出報頭和報尾及格式化輸出。
BEGIN END 採用print語句格式輸出
例如:
awk 'BEGIN {print "Name Belt\n----------------------"} {print
$1 "\t\t" $4} END {print "end-of-report"}' grade.txt
Name Belt
----------------------
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brow-3 12 26 26
L.Tansley 05/99 4712 Brow-3 12 30 28
end-of-report
tom@svr:~/ssh$
BEGIN: 設置計數和打印頭
END:用來在a w k完成文本瀏覽動作後打印輸出文本總數和結尾狀態標誌
2、使用正則表達式 ~
1)打印第4個域值爲Green和green的行
tom@svr:~/ssh$ awk '{if($4~/[Gg]reen/) print $0}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
tom@svr:~/ssh$
2)打印第4個域值非Green和green的行 !~
tom@svr:~/ssh$ awk '{if($4!~/[Gg]reen/) print $0}' grade.txt
P.Bunny 02/99 48 Yellow 12 35 28
J.Troll 07/99 4842 Brow-3 12 26 26
L.Tansley 05/99 4712 Brow-3 12 30 28
tom@svr:~/ssh$
3)匹配行中出現有特定字符的行,省去了if條件
tom@svr:~/ssh$ awk '$0 ~/[Gg]reen/ {print $0}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
tom@svr:~/ssh$
3、條件表達式
完全匹配某字符串 ==
tom@svr:~/ssh$ awk '{if($4=="Green") print $0}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
tom@svr:~/ssh$
不可寫成:
awk 'if($4=="Green") {print $0}' grade.txt
if條件是動作的一部分,必須與動作寫在一個花括號內。
AWK內置變量:
NR:已讀的記錄數
NF:瀏覽記錄的域個數
FILENAME: awk瀏覽的文件名 awk一次可以瀏覽多個文件
tom@svr:~/ssh$ awk '{if(NR>0 && $4~/(green|Green)/) print $0}' grade.txt
M.Tansley 05/99 48311 Green 8 40 44
J.Lulu 06/99 48317 green 9 24 26
tom@svr:~/ssh$