Awk是爲高級文本處理而設計的通用腳本語言。它主要用作報告和分析工具。本文介紹awk在命令行中操作文本的使用方式。 |
Awk一次對一條記錄進行操作,直到到達輸入的末尾。記錄由一個稱爲記錄分隔符的字符分隔。默認的記錄分隔符是換行符,這意味着文本數據中的每一行都是一個記錄。
每條記錄中的字段由$
後跟字段號(以1開頭)引用。第一個字段用$1
表示,第二個字段用$2
表示,依此類推。最後一個字段也可以用特殊變量$NF
引用。整個記錄可以用$0
引用。
Awk模式
Awk支持不同類型的模式,包括正則表達式、關係表達式、範圍和特殊表達式模式。
在下面的例子中,將創建一個名爲“ teams.txt”的文件,文件內容如下:
[root@localhost ~]# cat teams.txt Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622 Celtics Boston 49 33 0.598 Pacers Indiana 48 34 0.585
正則表達式模式
Awk的正則表達式模式用斜線(//)包含起來,例如:要顯示包含“0.5”的每條記錄,可以運行以下命令:
[root@localhost ~]# awk '/0.5/ {print $0}' teams.txt Celtics Boston 49 33 0.598 Pacers Indiana 48 34 0.585
要顯示包含“0.5”的每條記錄的第一個和第二個字段:
[root@localhost ~]# awk '/0.5/ {print $1,$2}' teams.txt Celtics Boston Pacers Indiana
顯示一個或者多個數字開頭的記錄,並打印第一列:
[root@localhost ~]# awk '/^[0-9]/ {print $1}' teams.txt 76ers
關係表達式模式
關係表達式模式通常用於匹配特定字段或變量的內容。
常用的關係運算符有:
~
:包含!~
:不包含>
:大於<
:小於>=
:大於等於<=
:小於等於=
:等於!=
:不等於
使用~
“包含”比較運算符。例如,顯示第二個字段中包含“ia”字符的每條記錄:
[root@localhost ~]# awk '$2 ~ /ia/ {print $0}' teams.txt 76ers Philadelphia 51 31 0.622 Pacers Indiana 48 34 0.585
若要匹配不包含給定字符的記錄,可以使用!~
不包含操作符。例如,顯示第二個字段中不包含“ia”字符的每條記錄:
[root@localhost ~]# awk '$2 !~ /ia/ {print $0}' teams.txt Bucks Milwaukee 60 22 0.732 Raptors Toronto 58 24 0.707 Celtics Boston 49 33 0.598
使用!=
“不等於”操作符,
使用>=
“大於等於”操作符,顯示第三個字段大於等於30的記錄:
[root@localhost ~]# awk '$4 >= 30 {print $0}' teams.txt 76ers Philadelphia 51 31 0.622 Celtics Boston 49 33 0.598 Pacers Indiana 48 34 0.585
範圍模式
範圍模式由逗號分隔的兩組字符組成,從與第一個字符串匹配的記錄開始,直到與第二個字符串的記錄匹配爲止的所有記錄。
例如,顯示從“Raptors”到 “Celtics”在內的記錄,:
[root@localhost ~]# awk '/Raptors/,/Celtics/ {print $0}' teams.txt Raptors Toronto 58 24 0.707 76ers Philadelphia 51 31 0.622 Celtics Boston 49 33 0.598
範圍模式也可以使用關係表達式,例如,顯示第四個字段等於31到第四個字段等於34 的記錄:
[root@localhost ~]# awk '$4 == 31 , $4 == 34 {print $0}' teams.txt 76ers Philadelphia 51 31 0.622 Celtics Boston 49 33 0.598 Pacers Indiana 48 34 0.585
特殊表達式模式
Awk包括以下特殊模式。
BEGIN
:在處理記錄之前執行此操作。END
:用於在處理記錄之後執行此操作。
BEGIN模式通常用於設置變量,END模式用於處理統計的數據。例如,下面將顯示“Start Processing.”,然後顯示第三個字段,最後顯示”End Processing.”:
[root@localhost ~]# awk 'BEGIN {print "Start Processing."};{print $3};END {print "End Processing."}' teams.txt Start Processing. 60 58 51 49 48 End Processing.
內置變量
Awk有許多內置變量,允許控制程序的處理方式。下面是一些常見的內置變量:
NF
:NR
:FILENAME
:FS
:RS
:OFS
:ORS
:
下面是一個顯示如何打印文件名和行數的示例:
[root@localhost ~]# awk 'END {print "File" , FILENAME , "contains" , NR , "lines."}' teams.txt File teams.txt contains 5 lines.
總結
Awk是最強大的文本處理工具之一。