Linux AWK工作原理

本篇文章我們主要為大家介紹 AWK 是如何工作的。

AWK 工作流程可分為三個部分:
1.讀輸入文件之前執行的程式碼段(由BEGIN關鍵字標識)。
2.主循環執行輸入文件的程式碼段。
3. 讀輸入文件之後的程式碼段(由END關鍵字標識)。
命令結構:
awk ‘BEGIN{ commands } pattern{ commands } END{ commands }’

下面的流程圖描述出了 AWK 的工作流程:

 

 

 

1、通過關鍵字 BEGIN 執行 BEGIN 塊的內容,即 BEGIN 後花括弧 {} 的內容。
2、完成 BEGIN 塊的執行,開始執行body塊。
3、讀入有 \n 換行符分割的記錄。
4、將記錄按指定的域分隔符劃分域,填充域,$0 則表示所有域(即一行內容),$1 表示第一個域,$n 表示第 n 個域。
5、依次執行各 BODY 塊,pattern 部分匹配該行內容成功後,才會執行 awk-commands 的內容。
6、循環讀取並執行各行直到文件結束,完成body塊執行。
7、開始 END 塊執行,END 塊可以輸出最終結果。

(1)開始塊(BEGIN)
開始塊的語法格式如下:
BEGIN {awk-commands}
開始塊就是在程式啟動的時候執行的程式碼部分,並且它在整個過程中只執行一次。
一般情況下,我們可以在開始塊中初始化一些變數。
BEGIN 是 AWK 的關鍵字,因此它必須是大寫的。
注意:開始塊部分是可選的,你的程式可以沒有開始塊部分。

(2)主體塊(BODY)
主體部分的語法格式如下:
/pattern/ {awk-commands}
對於每一個輸入的行都會執行一次主體部分的命令。
默認情況下,對於輸入的每一行,AWK 都會執行命令。但是,我們可以將其限定在指定的模式中。
注意:在主體塊部分沒有關鍵字存在。

(3)結束塊(END)
結束塊的語法格式如下:
END {awk-commands}
結束塊是在程式結束時執行的程式碼。 END 也是 AWK 的關鍵字,它也必須大寫。 與開始塊相似,結束塊也是可選的。

實例
先創建一個名為 marks.txt 的文件。其中包括序列號、學生名字、課程名稱與所得分數。
1) 張三 語文 80
2) 李四 數學 90
3) 王五 英語 87
接下來,我們將使用 AWK 腳本來顯示輸出文件中的內容,同時輸出表頭資訊。
$ awk ‘BEGIN{printf “序號\t名字\t課程\t分數\n”} {print}’ marks.txt
執行以上命令,輸出結果如下:
序號    名字    課程    分數
1) 張三 語文 80                 
2) 李四 數學 90                 
3) 王五 英語 87                 
程式開始執行時,AWK 在開始塊中輸出表頭資訊。在主體塊中,AWK 每讀入一行就將讀入的內容輸出至標準輸出流中,一直到整個文件被全部讀入為止。