本章將介紹AWK究竟如何工作的。成為一個(gè)專家AWK程序員,需要知道它的內(nèi)部流程。 AWK遵循一個(gè)簡單的工作流程:讀取,執(zhí)行和重復(fù)。下圖描述了工作流程。
AWK從輸入流(文件,管道,或標(biāo)準(zhǔn)輸入)讀取一行,并將其存儲在存儲器(內(nèi)存)中。
所有的AWK命令依次提交輸入。默認(rèn)情況下AWK執(zhí)行命令每一行,但我們可以通過提供的模式限制。
重復(fù)這個(gè)過程,直到該文件被處理完成。
我們已經(jīng)看到了AWK程序的工作流程?,F(xiàn)在來了解AKW程序的結(jié)構(gòu)。
以下是BEGIN塊語法:
BEGIN {awk-commands}
在BEGIN塊被在程序啟動(dòng)時(shí)執(zhí)行,且只執(zhí)行一次。這是一個(gè)很好的初始化變量的地方。 BEGIN是AWK關(guān)鍵字,因此它必須是大寫。請注意,這個(gè)塊是可選的。
以下是主體(Body)塊的語法:
/pattern/ {awk-commands}
主體塊適用于AWK的每個(gè)輸入行命令。默認(rèn)情況下AWK執(zhí)行每一行命令,但可以通過提供的模式限制。請注意,沒有主體塊的關(guān)鍵字。
以下是END塊的語法:
END {awk-commands}
END塊被在程序結(jié)束時(shí)執(zhí)行。END是AWK關(guān)鍵字,因此它必須是大寫。請注意,此塊也是可選的。
讓創(chuàng)建一個(gè)包含序列號的學(xué)生,名字,科目并標(biāo)記數(shù)量,文件的名稱為:marks.txt。
1) Amit Physics 80 2) Rahul Maths 90 3) Shyam Biology 87 4) Kedar English 85 5) Hari History 89
現(xiàn)在用AWK腳本顯示包含頭文件的內(nèi)容。
[jerry]$ awk 'BEGIN{printf "Sr No\tName\tSub\tMarks\n"} {print}' marks.txt
當(dāng)執(zhí)行上面的代碼時(shí),會(huì)產(chǎn)生以下結(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從BEGIN塊頭打印。然后,在主體塊時(shí),它從一個(gè)文件讀取一行,并執(zhí)行打印標(biāo)準(zhǔn)輸出流的內(nèi)容,使用AWK的printf命令。這個(gè)過程不斷重復(fù),直到文件被耗盡。