Awk是一種通用腳本語言,用于高級文本處理的。它主要用作報告和分析工具。與大多數(shù)其他程序性編程語言不同。
Awk是數(shù)據(jù)驅動的,這意味著您必須定義一組針對輸入文本要執(zhí)行的操作。它獲取輸入數(shù)據(jù),對其進行轉換,然后將結果發(fā)送到標準輸出。
awk有幾種不同的實現(xiàn)。我們將使用Awk的GNU實現(xiàn),稱為gawk。在大多數(shù)Linux發(fā)行版可用,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可以處理文本數(shù)據(jù)和流。將輸入的數(shù)據(jù)分為記錄和字段。Awk一次對一條記錄進行操作,直到達到輸入結束為止。
記錄由記錄分隔符分隔。默認的記錄分隔符是換行符,這意味著文本數(shù)據(jù)中的每一行都是一條記錄??梢允褂?code>RS變量來設置記錄分的隔符。
記錄由多個字段組成,并且使用字段分隔符分隔。默認情況下,字段之間用空格分隔,可以是一個或多個制表符,空格等,你可以使用awk命令的-F選項指定字段的分隔符。
每條記錄中的字段都可以使用美元符號$后跟字段編號表示,從1開始。第一個字段由$1表示,第二個字段由$2表示。
依此類推,最后一個字段也可以用特殊變量$NF表示。整個記錄可以用$0表示。
下面可以直觀展示記錄和字段的關系,也是awk處理文本數(shù)據(jù)默認使用的記錄分隔符,即換行符。字段分隔符是空格符。
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將會搜索以兩個或多個數(shù)字開頭的記錄,并打印第一個字段。
awk '/0.5/ { print $1 }' teams.txt
Celtics
Pacers
awk '/^[0-9][0-9]/ { print $1 }' teams.txt
76ers
關系表達模式
關系表達式模式通常用于匹配指定字段或變量的內容。默認情況下,正則表達式模式與記錄進行匹配。
要將正則表達式與字段進行匹配,請指定字段并針對模式使用包含比較運算符約等于號~。要匹配不包含指定模式的字段,請使用不約等于運算符!~。
除了約等于和不約等于符號之外,您可以比較字符串或數(shù)字之間的關系,例如大于>,小于<,等于=符號。
例如命令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
范圍模式
范圍模式由用逗號分隔的兩個模式組成,從匹配第一個模式的記錄開始,直到匹配第二個模式的記錄停止匹配。
也就是說匹配兩個模式之間的記錄都會被執(zhí)行相關的操作。即使中間記錄沒有匹配模式也將會被執(zhí)行相關操作。
但有一點值得注意的是范圍模式不能與某些模式表達式組合使用。但范圍模式可以與關系表達式組合使用。
例如命令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用于在處理記錄之前執(zhí)行的操作。END用于在處理記錄后執(zhí)行操作。
BEGIN模式通常用于聲明變量,END模式通常用于處理記錄中的數(shù)據(jù),例如統(tǒng)計指定字段的總數(shù)。
如果程序只有BEGIN模式,則執(zhí)行操作,并且不處理輸入數(shù)據(jù)。如果程序只有END模式,則在執(zhí)行操作之前先處理輸入。
awk的Gnu版本還包含另外兩個特殊模式BEGINFILE和ENDFILE,它們允許您在處理文件時執(zhí)行操作。
在下面的示例中將打印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
+關注
關注
88文章
11822瀏覽量
219602 -
命令
+關注
關注
5文章
759瀏覽量
23986 -
腳本語言
+關注
關注
0文章
48瀏覽量
8614
發(fā)布評論請先 登錄
Linux Awk命令實例教程
Linux中grep、sed和awk命令詳解
Linux系統(tǒng)命令及其使用詳解 _120頁
Linux Awk用法總結
一文詳解Linux awk命令
評論