讓咱們開始使用它。php
awk
是用於 Unix 和類 Unix 系統的強大文本解析工具,可是因爲它有可編程函數,所以你能夠用它來執行常規解析任務,所以它也被視爲一種編程語言。你可能不會使用 awk
開發下一個 GUI 應用,而且它可能不會代替你的默認腳本語言,可是它是用於特定任務的強大程序。linux
這些任務或許是驚人的多樣化。瞭解 awk
能夠解決你的哪些問題的最好方法是學習 awk
。你會驚訝於 awk
如何幫助你完成更多工做,卻花費更少的精力。git
awk
的基本語法是:github
awk [options] 'pattern {action}' file
複製代碼
首先,建立此示例文件並將其保存爲 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
複製代碼
數據被一個或多個空格分隔爲列。以某種方式組織要分析的數據是很常見的。它不必定老是由空格分隔的列,甚至能夠不是逗號或分號,但尤爲是在日誌文件或數據轉儲中,一般有一個可預測的格式。你可使用數據格式來幫助 awk
提取和處理你關注的數據。編程
在 awk
中,print
函數顯示你指定的內容。你可使用許多預約義的變量,可是最多見的是文本文件中以整數命名的列。試試看:bash
$ awk '{print $2;}' colours.txt
color
red
yellow
red
purple
green
purple
brown
brown
yellow
複製代碼
在這裏,awk
顯示第二列,用 $2
表示。這是相對直觀的,所以你可能會猜想 print $1
顯示第一列,而 print $3
顯示第三列,依此類推。app
要顯示所有列,請使用 $0
。編程語言
美圓符號($
)後的數字是表達式,所以 $2
和 $(1+1)
是同一意思。函數
你使用的示例文件很是結構化。它有一行充當標題,而且各列直接相互關聯。經過定義條件,你能夠限定 awk
在找到此數據時返回的內容。例如,要查看第二列中與 yellow
匹配的項並打印第一列的內容:
awk '$2=="yellow"{print $1}' file1.txt
banana
pineapple
複製代碼
正則表達式也能夠工做。此表達式近似匹配 $2
中以 p
開頭跟上任意數量(一個或多個)字符後繼續跟上 p
的值:
$ awk '$2 ~ /p.+p/ {print $0}' colours.txt
grape purple 10
plum purple 2
複製代碼
數字能被 awk
天然解釋。例如,要打印第三列包含大於 5 的整數的行:
awk '$3>5 {print $1, $2}' colours.txt
name color
banana yellow
grape purple
apple green
potato brown
複製代碼
默認狀況下,awk
使用空格做爲字段分隔符。可是,並不是全部文本文件都使用空格來定義字段。例如,用如下內容建立一個名爲 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
複製代碼
只要你指定將哪一個字符用做命令中的字段分隔符,awk
就能以徹底相同的方式處理數據。使用 --field-separator
(或簡稱爲 -F
)選項來定義分隔符:
$ awk -F"," '$2=="yellow" {print $1}' file1.csv
banana
pineapple
複製代碼
使用輸出重定向,你能夠將結果寫入文件。例如:
$ awk -F, '$3>5 {print $1, $2} colours.csv > output.txt 複製代碼
這將建立一個包含 awk
查詢內容的文件。
你還能夠將文件拆分爲按列數據分組的多個文件。例如,若是要根據每行顯示的顏色將 colours.txt
拆分爲多個文件,你能夠在 awk
中包含重定向語句來重定向每條查詢:
$ awk '{print > $2".txt"}' colours.txt
複製代碼
這將生成名爲 yellow.txt
、red.txt
等文件。
在下一篇文章中,你將瞭解有關字段,記錄和一些強大的 awk 變量的更多信息。
本文改編自社區技術播客 Hacker Public Radio。
via: opensource.com/article/19/…
做者:Seth Kenlon 選題:lujun9972 譯者:geekpi 校對:wxy