Awk是一種通用腳本語言,用于高級文本處理的。它主要用作報告和分析工具。與大多數其他程序性編程語言不同。
Awk是數據驅動的,這意味著您必須定義一組針對輸入文本要執行的操作。它獲取輸入數據,對其進行轉換,然后將結果發送到標準輸出。
awk有幾種不同的實現。我們將使用Awk的GNU實現,稱為gawk。在大多數Linux發行版可用,awk
命令只gawk
的符號鏈接。
在本教程的所有示例中,我們將使用teams.txt文件作為awk的輸入,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
teams.txt
記錄和字段
Awk可以處理文本數據和流。將輸入的數據分為記錄和字段。Awk一次對一條記錄進行操作,直到達到輸入結束為止。
記錄由記錄分隔符分隔。默認的記錄分隔符是換行符,這意味著文本數據中的每一行都是一條記錄??梢允褂?code>RS變量來設置記錄分的隔符。
記錄由多個字段組成,并且使用字段分隔符分隔。默認情況下,字段之間用空格分隔,可以是一個或多個制表符,空格等,你可以使用awk命令的-F
選項指定字段的分隔符。
每條記錄中的字段都可以使用美元符號$
后跟字段編號表示,從1開始。第一個字段由$1
表示,第二個字段由$2
表示。
依此類推,最后一個字段也可以用特殊變量$NF
表示。整個記錄可以用$0
表示。
下面可以直觀展示記錄和字段的關系,也是awk處理文本數據默認使用的記錄分隔符,即換行符。字段分隔符是空格符。
tmpfs 788M 1.8M 786M 1% /run/lock
/dev/sda1 234G 191G 31G 87% /
|-------| |--| |--| |--| |-| |--------|
$1 $2 $3 $4 $5 $6 ($NF) --> 字段 $1,$2...字段
|-----------------------------------------|
$0 --> 記錄由多個字段組成的單行記錄
正則表達式模式
正則表達式是與一組字符串匹配的模式。Awk正則表達式模式包含在斜杠//
中。這是正則表達式模式語法形式/regex pattern/ { action }
。
模式可以是任何類型的擴展正則表達式,換句話說,你在其它語言使用的正則表達式都可以用于awk。
例如命令awk '/0.5/ { print $1 }' teams.txt
僅打印包含0.5記錄的第一個字段。
命令awk '/^[0-9][0-9]/ { print $1 }' teams.txt
將會搜索以兩個或多個數字開頭的記錄,并打印第一個字段。
awk '/0.5/ { print $1 }' teams.txt
Celtics
Pacers
awk '/^[0-9][0-9]/ { print $1 }' teams.txt
76ers
關系表達模式
關系表達式模式通常用于匹配指定字段或變量的內容。默認情況下,正則表達式模式與記錄進行匹配。
要將正則表達式與字段進行匹配,請指定字段并針對模式使用包含比較運算符約等于號~
。要匹配不包含指定模式的字段,請使用不約等于運算符!~
。
除了約等于和不約等于符號之外,您可以比較字符串或數字之間的關系,例如大于>,小于<,等于=符號。
例如命令awk '$2 ~ /ia/ { print $1 }' teams.txt
將會搜索第二個字段包含ia
的記錄并打印第一個字段。
awk '$2 ~ /ia/ { print $1 }' teams.txt
76ers
Pacers
例如命令awk '$2 !~ /ia/ { print $1 }' teams.txt
將會搜索第二個字段不包含ia
的記錄并打印第一個字段。
awk '$2 !~ /ia/ { print $1 }' teams.txt
Bucks
Raptors
Celtics
例如命令awk '$3 > 50 { print $1 }' teams.txt
將會搜索三字段大于50的所有記錄,并打印第一字段。
awk '$3 > 50 { print $1 }' teams.txt
Bucks
Raptors
76ers
范圍模式
范圍模式由用逗號分隔的兩個模式組成,從匹配第一個模式的記錄開始,直到匹配第二個模式的記錄停止匹配。
也就是說匹配兩個模式之間的記錄都會被執行相關的操作。即使中間記錄沒有匹配模式也將會被執行相關操作。
但有一點值得注意的是范圍模式不能與某些模式表達式組合使用。但范圍模式可以與關系表達式組合使用。
例如命令awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
將會搜索從包含Raptors的記錄開始到包含Celtics記錄結束的所有記錄。
然后打印兩個模式之間所有記錄的第一個字段{ print $1 }
。
awk '/Raptors/,/Celtics/ { print $1 }' teams.txt
Raptors
76ers //這個記錄沒有匹配到兩個模式中任意一個,但它在兩個模式之間,所以也會打印
Celtics
例如命令awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
組合范圍模式和關系表達式。
將會搜索第四個字段等于31記錄開始,直到第四個字段等于33的所有記錄。然后打印整個記錄$0
。
awk '$4 == 31, $4 == 33 { print $0 }' teams.txt
76ers Philadelphia 51 31 0.622
Celtics Boston 49 33 0.598
特殊表達模式
Awk可以使用的特殊模式是。BEGIN
用于在處理記錄之前執行的操作。END
用于在處理記錄后執行操作。
BEGIN
模式通常用于聲明變量,END
模式通常用于處理記錄中的數據,例如統計指定字段的總數。
如果程序只有BEGIN
模式,則執行操作,并且不處理輸入數據。如果程序只有END
模式,則在執行操作之前先處理輸入。
awk的Gnu版本還包含另外兩個特殊模式BEGINFILE
和ENDFILE
,它們允許您在處理文件時執行操作。
在下面的示例中將打印Start Processing.
,然后打印每個記錄的第三個字段,最后打印End Processing.
。這是一個簡單的示例,你也可以用于打印字段的名稱。
awk 'BEGIN { print "Start Processing." }; { print $3 }; END { print "End Processing." }' teams.txt
Start Processing
60
58
51
49
48
End Processing.
組合模式
Awk允許您使用邏輯AND運算符&&
和邏輯或運算符||
組合兩個或多個模式。
例如命令awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
使用&&
運算符搜索第三字段大于50而第四字段小于30的記錄,然后打印已匹配記錄的第一個字段。
awk '$3 > 50 && $4 < 30 { print $1 }' teams.txt
Bucks
Raptors
-
Linux
+關注
關注
87文章
11230瀏覽量
208932 -
命令
+關注
關注
5文章
678瀏覽量
21984 -
腳本語言
+關注
關注
0文章
48瀏覽量
8209
發布評論請先 登錄
相關推薦
評論