本章節(jié)中,我們將用幾個示例來講解幾個有用的 AWK 命令。 假設(shè)我們經(jīng)有一個文件文件 marks.txt 等待處理,它所包含的內(nèi)容如下:
1) Amit Physics 80
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
我們可以使用 AWK 命令僅輸出輸入文件中某些特定的列的內(nèi)容。示例如下:
[jerry]$ awk '{print $3 "\t" $4}' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
Physics 80
Maths 90
Biology 87
English 85
History 89
在 marks.txt 文件中,第三列包含課程名字,第四列包含在該課程的得分。我們使用 AWK 輸出命令只輸出了這兩列的內(nèi)容。上面例子中,$3與$4代表輸入記錄中的第三列與第四列的內(nèi)容。
默認情況下,如果某行與模式串匹配,AWK 會將整行輸出:
[jerry]$ awk '/a/ {print $0}' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
2) Rahul Maths 90
3) Shyam Biology 87
4) Kedar English 85
5) Hari History 89
上面的示例中,我們搜索模式串 a,每次成功匹配后都會執(zhí)行主體塊中的命令。如果沒有主體塊——默認的動作是輸出記錄(行)。因此上面的效果也可以使用下面簡略方式實現(xiàn),它們會得到相同的結(jié)果:
[jerry]$ awk '/a/' marks.txt
前面我們已經(jīng)看到了,當模式串匹配成功后, AWK 默認會輸出整個記錄。不過,我們可以讓 AWK 只輸出特定的域(列)的內(nèi)容。 例如,下面的這個例子中當模式串匹配成功后只會輸出第三列與第四列的內(nèi)容:
[jerry]$ awk '/a/ {print $3 "\t" $4}' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
Maths 90
Biology 87
English 85
History 89
我們能以任意順序輸出各列嗎?當然可以! 下面的例子中我們將在第四列后輸出第三列的內(nèi)容:
[jerry]$ awk '/a/ {print $4 "\t" $3}' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
90 Maths
87 Biology
85 English
89 History
讓我們嘗試一個更有意思的例子,在這個例子中我們會統(tǒng)計模式串成功匹配的次數(shù),并將該結(jié)果打印出來:
[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
Count = 4
上面這個例子中,每次成功的匹配我們都會增加計數(shù)器的值,并在結(jié)束塊中將該計數(shù)器的值輸出。 請注意,與其它編程語言不一樣的地方在于, AWK 在使用一個變量前不需要特意地聲明這個變量。
這個例子中我們只輸出那些字符數(shù)超過 18 的記錄:
[jerry]$ awk 'length($0) > 18' marks.txt
執(zhí)行上面的命令可以得到如下結(jié)果:
3) Shyam Biology 87
4) Kedar English 85
AWK 提供了內(nèi)置的 length 函數(shù)。該函數(shù)返回字符串的長度。變量 $0 表示整行,缺失的主體塊會執(zhí)行默認動作,例如,打印輸出。 因此,如果一行中字符數(shù)超過 18, 則比較的結(jié)果為真,該行則被輸出。
更多建議: