鍍金池/ 教程/ Linux/ 基本示例
循環(huán)  
操作符  
優(yōu)雅地輸出
用戶自定義函數(shù)
正則表達(dá)式
基本示例
內(nèi)置函數(shù)
工作流程
概述
控制流  
數(shù)組  
輸出重定向
基本語法
運行環(huán)境
內(nèi)置變量

基本示例

本章節(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)容。

輸出所有行

默認(rèn)情況下,如果某行與模式串匹配,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í)行主體塊中的命令。如果沒有主體塊——默認(rèn)的動作是輸出記錄(行)。因此上面的效果也可以使用下面簡略方式實現(xiàn),它們會得到相同的結(jié)果:

[jerry]$ awk '/a/' marks.txt

通過匹配模式串輸出列

前面我們已經(jīng)看到了,當(dāng)模式串匹配成功后, AWK 默認(rèn)會輸出整個記錄。不過,我們可以讓 AWK 只輸出特定的域(列)的內(nèi)容。 例如,下面的這個例子中當(dāng)模式串匹配成功后只會輸出第三列與第四列的內(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

計數(shù)匹配次數(shù)并輸出

讓我們嘗試一個更有意思的例子,在這個例子中我們會統(tǒng)計模式串成功匹配的次數(shù),并將該結(jié)果打印出來:

[jerry]$ awk '/a/{++cnt} END {print "Count = ", cnt}' marks.txt

執(zhí)行上面的命令可以得到如下結(jié)果:

Count = 4

上面這個例子中,每次成功的匹配我們都會增加計數(shù)器的值,并在結(jié)束塊中將該計數(shù)器的值輸出。 請注意,與其它編程語言不一樣的地方在于, AWK 在使用一個變量前不需要特意地聲明這個變量。

輸出字符數(shù)多于 18 的行

這個例子中我們只輸出那些字符數(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í)行默認(rèn)動作,例如,打印輸出。 因此,如果一行中字符數(shù)超過 18, 則比較的結(jié)果為真,該行則被輸出。