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