awk入門 —— 強(qiáng)大的文本分析工具
讓我們開始使用它。
awk
是用于 Unix 和類 Unix 系統(tǒng)的強(qiáng)大文本解析工具,但是由于它有可編程函數(shù),因此你可以用它來(lái)執(zhí)行常規(guī)解析任務(wù),因此它也被視為一種編程語(yǔ)言。你可能不會(huì)使用 awk
開發(fā)下一個(gè) GUI 應(yīng)用,并且它可能不會(huì)代替你的默認(rèn)腳本語(yǔ)言,但是它是用于特定任務(wù)的強(qiáng)大程序。
這些任務(wù)或許是驚人的多樣化。了解 awk
可以解決你的哪些問(wèn)題的最好方法是學(xué)習(xí) awk
。你會(huì)驚訝于 awk
如何幫助你完成更多工作,卻花費(fèi)更少的精力。
awk
的基本語(yǔ)法是:
awk [options] 'pattern {action}' file
首先,創(chuàng)建此示例文件并將其保存為 colours.txt
。
name color amount
apple red 4
banana yellow 6
strawberry red 3
grape purple 10
apple green 8
plum purple 2
kiwi brown 4
potato brown 9
pineapple yellow 5
數(shù)據(jù)被一個(gè)或多個(gè)空格分隔為列。以某種方式組織要分析的數(shù)據(jù)是很常見的。它不一定總是由空格分隔的列,甚至可以不是逗號(hào)或分號(hào),但尤其是在日志文件或數(shù)據(jù)轉(zhuǎn)儲(chǔ)中,通常有一個(gè)可預(yù)測(cè)的格式。你可以使用數(shù)據(jù)格式來(lái)幫助 awk
提取和處理你關(guān)注的數(shù)據(jù)。
打印列
在 awk
中,print
函數(shù)顯示你指定的內(nèi)容。你可以使用許多預(yù)定義的變量,但是最常見的是文本文件中以整數(shù)命名的列。試試看:
$ awk '{print $2;}' colours.txt
color
red
yellow
red
purple
green
purple
brown
brown
yellow
在這里,awk
顯示第二列,用 $2
表示。這是相對(duì)直觀的,因此你可能會(huì)猜測(cè) print $1
顯示第一列,而 print $3
顯示第三列,依此類推。
要顯示全部列,請(qǐng)使用 $0
。
美元符號(hào)($
)后的數(shù)字是表達(dá)式,因此 $2
和 $(1+1)
是同一意思。
有條件地選擇列
你使用的示例文件非常結(jié)構(gòu)化。它有一行充當(dāng)標(biāo)題,并且各列直接相互關(guān)聯(lián)。通過(guò)定義條件,你可以限定 awk
在找到此數(shù)據(jù)時(shí)返回的內(nèi)容。例如,要查看第二列中與 yellow
匹配的項(xiàng)并打印第一列的內(nèi)容:
awk '$2=="yellow"{print $1}' file1.txt
banana
pineapple
正則表達(dá)式也可以工作。此表達(dá)式近似匹配 $2
中以 p
開頭跟上任意數(shù)量(一個(gè)或多個(gè))字符后繼續(xù)跟上 p
的值:
$ awk '$2 ~ /p.+p/ {print $0}' colours.txt
grape purple 10
plum purple 2
數(shù)字能被 awk
自然解釋。例如,要打印第三列包含大于 5 的整數(shù)的行:
awk '$3>5 {print $1, $2}' colours.txt
name color
banana yellow
grape purple
apple green
potato brown
字段分隔符
默認(rèn)情況下,awk
使用空格作為字段分隔符。但是,并非所有文本文件都使用空格來(lái)定義字段。例如,用以下內(nèi)容創(chuàng)建一個(gè)名為 colours.csv
的文件:
name,color,amount
apple,red,4
banana,yellow,6
strawberry,red,3
grape,purple,10
apple,green,8
plum,purple,2
kiwi,brown,4
potato,brown,9
pineapple,yellow,5
只要你指定將哪個(gè)字符用作命令中的字段分隔符,awk
就能以完全相同的方式處理數(shù)據(jù)。使用 --field-separator
(或簡(jiǎn)稱為 -F
)選項(xiàng)來(lái)定義分隔符:
$ awk -F"," '$2=="yellow" {print $1}' file1.csv
banana
pineapple
保存輸出
使用輸出重定向,你可以將結(jié)果寫入文件。例如:
$ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt
這將創(chuàng)建一個(gè)包含 awk
查詢內(nèi)容的文件。
你還可以將文件拆分為按列數(shù)據(jù)分組的多個(gè)文件。例如,如果要根據(jù)每行顯示的顏色將 colours.txt
拆分為多個(gè)文件,你可以在 awk
中包含重定向語(yǔ)句來(lái)重定向每條查詢:
$ awk '{print > $2".txt"}' colours.txt
這將生成名為 yellow.txt
、red.txt
等文件。