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