這一章節(jié)中,我們將解釋 AWK 是如何工作的。 要想成為 AWK 專家,你必須得了解其內(nèi)部工作的原理。 AWK 執(zhí)行的流程非常簡單:讀( Read )、執(zhí) 行( Execute )與重復(fù)( Repeat )。下面的流程圖描述出了 AWK 的工作流程:
AWK 從輸入流(文件、管道或者標(biāo)準(zhǔn)輸入)中讀入一行然后將其存入內(nèi)存中。
對(duì)于每一行輸入,所有的 AWK 命令按順執(zhí)行。 默認(rèn)情況下,AWK 命令是針對(duì)于每一行輸入,但是我們可以將其限制在指定的模式中。
一直重復(fù)上述兩個(gè)過程直到文件結(jié)束。
我們已經(jīng)見過 AWK 程序的工作流程。 現(xiàn)在讓我們一起來學(xué)習(xí) AWK 程序的結(jié)構(gòu)。
開始?jí)K的語法格式如下所示:
BEGIN {awk-commands}
顧名思義,開始?jí)K就是在程序啟動(dòng)的時(shí)候執(zhí)行的代碼部分,并且它在整個(gè)過程中只執(zhí)行一次。 一般情況下,我們?cè)陂_始?jí)K中初始化一些變量。BEGIN 是 AWK 的關(guān)鍵字,因此它必須是大寫的。 不過,請(qǐng)注意,開始?jí)K部分是可選的,你的程序可以沒有開始?jí)K部分。
主體部分的語法要求如下:
/pattern/ {awk-commands}
對(duì)于每一個(gè)輸入的行都會(huì)執(zhí)行一次主體部分的命令。默認(rèn)情況下,對(duì)于輸入的每一行,AWK 都會(huì)很執(zhí)行命令。但是,我們可以將其限定在指定的模式中。 注意,在主體塊部分沒有關(guān)鍵字存在。
下面是結(jié)束塊的語法格式:
END {awk-commands}
結(jié)束塊是在程序結(jié)束時(shí)執(zhí)行的代碼。 END 也是 AWK 的關(guān)鍵字,它也必須大寫。 與開始?jí)K相似,結(jié)束塊也是可選的。
先創(chuàng)建一個(gè)名為 marks.txt 的文件。其中包括序列號(hào)、學(xué)生名字、課程名稱與所得分?jǐn)?shù)。
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
接下來,我們將使用 AWK 腳本來顯示輸出文件中的內(nèi)容,同時(shí)輸出表頭信息。
[jerry]$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt
執(zhí)行上面的代碼后,將會(huì)輸出如下的結(jié)果:
Sr No Name Sub Marks
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
程序啟動(dòng)時(shí),AWK 在開始?jí)K中輸出表頭信息。在主體塊中,AWK 每讀入一行就將讀入的內(nèi)容輸出至標(biāo)準(zhǔn)輸出流中,一直到整個(gè)文件被全部讀入為止。
更多建議: