awk 中文man頁面
用途
在文件中查找與模式匹配的行,然后在它們上面執(zhí)行特定的操作。
語法
awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | 'Program' } [ [ File ... | Assignment ... ] ] ...
描述
awk 命令利用一組用戶提供的指令來將一組文件和用戶提供的擴展正則表達式比較,一次一行。然后在任何與擴展正則表達式匹配的行上執(zhí)行操作。awk 處理的***記錄大小為 10KB。
awk 命令的模式搜索比 grep 命令的搜索更常用,且它允許用戶在輸入文本行上執(zhí)行多個操作。awk 命令編程語言不需要編譯,并允許用戶使用變量、數(shù)字函數(shù)、字符串函數(shù)和邏輯運算符。
awk 命令受到 LANG、LC_ALL、LC_COLLATE、LC_CTYPE、LC_MESSAGES、LC_NUMERIC、NLSPATH 和 PATH 環(huán)境變量的影響。
本章中包括以下主題:
awk 命令的輸入
awk 命令的輸出
通過記錄和字段的文件處理
awk 命令編程語言
模式
操作
變量
特殊變量
標(biāo)志
示例
awk 命令的輸入
awk 命令采取兩種類型的輸入:輸入文本文件和程序指令。
輸入文本文件
搜索和操作在輸入文本文件上執(zhí)行。文件如下指定:
在命令行指定 File 變量。
修改特殊變量 ARGV 和 ARGC。
在缺省 File 變量的情況下提供標(biāo)準(zhǔn)輸入。
如果用 File 變量指定多個文件,則文件以指定的順序處理。
程序指令
用戶提供的指令控制 awk 命令的操作。這些指令來自命令行的‘Program’變量或來自用 -f 標(biāo)志和 ProgramFile
變量一起指定的文件。如果指定多個程序文件,這些文件以指定的順序串聯(lián),且使用指令的生成的順序。
awk 命令的輸出
awk 命令從輸入文本文件中的數(shù)據(jù)產(chǎn)生三種類型的輸出:
選定的數(shù)據(jù)可以打印至標(biāo)準(zhǔn)輸出,此輸出完全同于輸入文件。
輸入文件的選定部分可以更改。
選定數(shù)據(jù)可以更改并可打印至標(biāo)準(zhǔn)輸出,此輸出可以同于或不同于輸入文件的內(nèi)容。
可以在同一個文件上執(zhí)行所有三種類型的輸出。awk 命令是別的編程語言允許用戶重定向輸出。
通過記錄和字段的文件處理
文件以下列方式處理:
awk 命令掃描它的指令,并執(zhí)行任何指定為在讀取輸入前發(fā)生的操作。
awk 編程語言中的 BEGIN 語句允許用于指定在讀取***個記錄前要執(zhí)行的一組指令。這對于初始化特殊變量特別有用。
從輸入文件讀取一個記錄。
記錄是由記錄分隔符隔開的一組數(shù)據(jù)。記錄分隔符的缺省值是換行字符,它使文件中的每一行成為一個單獨的記錄。記錄分隔符可以通過設(shè)置 RS 特殊變量來更改。
記錄是相對于 awk 命令的指令指定的每種模式比較。
命令指令可以指定應(yīng)比較記錄內(nèi)的特定字段。缺省情況下,字段由空白區(qū)(空格或跳格)隔開。每個字段由一個字段變量表示。記錄中的***個字段指定為 $1
變量,第二個字段指定為 $2 變量,以此類推。整個記錄指定為 $0 變量。字段分隔符可以通過在命令行使用 -F 標(biāo)志或通過設(shè)置 FS 特殊變量來更改。FS
特殊變量可以設(shè)置為下列值:空格、單個字符或擴展正則表達式。
如果一個記錄與一個模式相匹配,則任何與該模式相關(guān)的操作都在該記錄上執(zhí)行。
在記錄和每個模式比較且執(zhí)行了所有指定操作以后,從輸入讀取下一個記錄;在從輸入文件讀取所有的記錄之前,該進程重復(fù)。
如果已經(jīng)指定了多個輸入文件,則下一個文件打開,且在讀取所有的輸入文件之前,該進程重復(fù)。
在讀取了***一個文件中的***一個記錄后,awk 命令執(zhí)行任何指定為在輸入處理后發(fā)生的指令。
awk 編程語言中的 END 語句允許用戶指定在讀取***一個記錄后要執(zhí)行的操作。這對于發(fā)送有關(guān) awk 命令完成了什么工作的消息特別有用。
awk 命令編程語言
awk 命令編程語言由以下格式的語句構(gòu)成:
Pattern { Action }
如果一個記錄與指定模式相匹配,或包含與該模式匹配的字段,則執(zhí)行相關(guān)的操作??梢灾付]有操作的模式,這種情況下,包含該模式的整行寫至標(biāo)準(zhǔn)輸出。為每個輸入記錄執(zhí)行指定的沒有模式的操作。
模式
在 awk 命令語言語法中使用四種類型的模式:
正則表達式
關(guān)系表達式
模式的組合
BEGIN 和 END 模式
正則表達式
awk 命令使用的擴展正則表達式類似于 grep 或 egrep 命令使用的表達式。擴展正則表達式的最簡單的形式就是包括在斜杠中的一串字符。例如,假定一個名為
testfile 的文件具有以下內(nèi)容:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
輸入以下一行命令:
awk '/smi/' testfile
將把包含 smi 字符串的具體值的所有記錄打印至標(biāo)準(zhǔn)輸出。在這個示例中,awk 命令的程序 '/smi/' 是一個沒有操作的模式。輸出是:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
以下特殊字符用于形成擴展正則表達式:
字符功能
+指定如果一個或多個字符或擴展正則表達式的具體值(在 +(加號)前)在這個字符串中,則字符串匹配。命令行:
awk '/smith+ern/' testfile
將包含字符 smit,后跟一個或多個 h 字符,并以字符 ern 結(jié)束的字符串的任何記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smithern, harry
smithhern, anne
?指定如果零個或一個字符或擴展正則表達式的具體值(在 ?(問號)之前)在字符串中,則字符串匹配。命令行:
awk '/smith?/' testfile
將包含字符 smit,后跟零個或一個 h 字符的實例的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
|指定如果以 |(垂直線)隔開的字符串的任何一個在字符串中,則字符串匹配。命令行:
awk '/allen
|
alan /' testfile
將包含字符串 allen 或 alan 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smiley, allen
smith, alan
( )在正則表達式中將字符串組合在一起。命令行:
awk '/a(ll)?(nn)?e/' testfile
將具有字符串 ae 或 alle 或 anne 或 allnne 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smiley, allen
smithhern, anne
{m}指定如果正好有 m 個模式的具體值位于字符串中,則字符串匹配。命令行:
awk '/l{2}/' testfile
打印至標(biāo)準(zhǔn)輸出
smiley, allen
{m,}指定如果至少 m 個模式的具體值在字符串中,則字符串匹配。命令行:
awk '/t{2,}/' testfile
打印至標(biāo)準(zhǔn)輸出:
smitters, alexis
{m, n}指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字符串中(其中m <= n),則字符串匹配。命令行:
awk '/er{1, 2}/' testfile
打印至標(biāo)準(zhǔn)輸出:
smithern, harry
smithern, anne
smitters, alexis
[String]指定正則表達式與方括號內(nèi) String 變量指定的任何字符匹配。命令行:
awk '/sm[a-h]/' testfile
將具有 sm 后跟以字母順序從 a 到 h 排列的任何字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例的輸出是:
smawley, andy
[^ String]在 [ ](方括號)和在指定字符串開頭的 ^ (插入記號) 指明正則表達式與方括號內(nèi)的任何字符不匹配。這樣,命令行:
awk '/sm[^a-h]/' testfile
打印至標(biāo)準(zhǔn)輸出:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
~,!~表示指定變量與正則表達式匹配(代字號)或不匹配(代字號、感嘆號)的條件語句。命令行:
awk '$1 ~ /n/' testfile
將***個字段包含字符 n 的所有記錄打印至標(biāo)準(zhǔn)輸出:
smithern, harry
smithhern, anne
^指定字段或記錄的開頭。命令行:
awk '$2 ~ /^h/' testfile
將把字符 h 作為第二個字段的***個字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smithern, harry
$指定字段或記錄的末尾。命令行:
awk '$2 ~ /y$/' testfile
將把字符 y 作為第二個字段的***一個字符的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smawley, andy
smithern, harry
.(句號)表示除了在空白末尾的終端換行字符以外的任何一個字符。命令行:
awk '/a..e/' testfile
將具有以兩個字符隔開的字符 a 和 e 的所有記錄打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smawley, andy
smiley, allen
smithhern, anne
*(星號)表示零個或更多的任意字符。命令行:
awk '/a.*e/' testfile
將具有以零個或更多字符隔開的字符 a 和 e 打印至標(biāo)準(zhǔn)輸出。此示例中的輸出是:
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis
\ (反斜杠)轉(zhuǎn)義字符。當(dāng)位于在擴展正則表達式中具有特殊含義的任何字符之前時,轉(zhuǎn)義字符除去該字符的任何特殊含義。例如,命令行:
/a\/\//
將與模式 a //
匹配,因為反斜杠否定斜杠作為正則表達式定界符的通常含義。要將反斜杠本身指定為字符,則使用雙反斜杠。有關(guān)反斜杠及其使用的更多信息,請參閱以下關(guān)于轉(zhuǎn)義序列的內(nèi)容。
識別的轉(zhuǎn)義序列
awk 命令識別大多數(shù)用于 C 語言約定中的轉(zhuǎn)義序列,以及 awk 命令本身用作特殊字符的幾個轉(zhuǎn)義序列。轉(zhuǎn)義序列是:
轉(zhuǎn)義序列表示的字符
\"\"(雙引號)
\//(斜杠)字符
\ddd其編碼由 1、2 或 3 位八進制整數(shù)表示的字符,其中 d 表示一個八進制數(shù)位
\\\ (反斜杠) 字符
\a警告字符
\b退格字符
\f換頁字符
\n換行字符(請參閱以下的注)
\r回車字符
\t跳格字符
\v垂直跳格
注:除了在 gsub、match、split 和 sub
內(nèi)置函數(shù)中,擴展正則表達式的匹配都基于輸入記錄。記錄分隔符字符(缺省情況下為換行字符)不能嵌套在表達式中,且沒與記錄分隔符字符匹配的表達式。 如果記錄分隔符不是換行字符,則可與換行字符匹配。在指定的四個內(nèi)置函數(shù)中,匹配基于文本字符串,且任何字符(包含記錄分隔符)可以嵌套在模式中,這樣模 式與適當(dāng)?shù)淖址嗥ヅ?。然而,?nbsp;
awk 命令進行的所有正則表達式匹配中,在模式使用一個或多個 NULL(空)字符將生成未定以的結(jié)果。
關(guān)系表達式
關(guān)系運算符 <(小于)、>(大于)、<=(小于或等于)、>=(大于或等于)、= =(等于)和 !=(不等于)可用來形成模式。例如,模式:
$1 < $4
將與***個字段小于第四個字段的記錄匹配。關(guān)系運算符還和字符串值一起使用。例如:
$1 =! "q"
將與***個字段不是 q 的所有記錄匹配。字符串值還可以根據(jù)校對值匹配。例如:
$1 >= "d"
將與***個字段以字符 a、b、c 或 d 開頭的所有記錄匹配。如果未給出其它信息,則字段變量作為字符串值比較。
模式的組合
可以使用三種選項組合模式:
范圍由兩種以 ,(逗號)隔開的模式指定。操作在每個以匹配***個模式的記錄開始的每個記錄上執(zhí)行,并通過匹配第二個模式的記錄(包含此記錄)繼續(xù)。例如:
/begin/,/end/
與包含字符串 begin 的記錄以及該記錄和包含字符串 end 之間的所有記錄(包含包括字符串 end 的記錄)匹配。
括號 ( ) 將模式組合在一起。
布爾運算符 ||(或)&&(和)以及 !(不)將模式組合成如果它們求值為真則匹配,否則不匹配的表達式。例如,模式:
$1 == "al" && $2 == "123"
與***個字段是 al 且第二個字段是 123 的記錄匹配。
BEGIN 和 END 模式
用 BEGIN 模式指定的操作在讀取任何輸入之前執(zhí)行。用 END 模式指定的操作在讀取了所有輸入后執(zhí)行。允許多個 BEGIN 和 END
模式,并以指定的順序處理它們。在程序語句中 END 模式可以在 BEGIN 模式之前。如果程序僅由 BEGIN 語句構(gòu)成,則執(zhí)行操作且不讀取輸入。如果程序僅由
END 語句構(gòu)成,則在任何操作執(zhí)行前讀取所有輸入。
操作
有多種類型的操作語句:
操作語句
內(nèi)置函數(shù)
用戶定義的函數(shù)
條件語句
輸出操作
操作語句
操作語句括在 { } (花括號) 中。如果語句指定為沒有模式,則它們在每個記錄上執(zhí)行。在括號里可以指定多個操作,但操作間必須以換行字符或
;(分號),且語句以它們出現(xiàn)的順序處理。操作語句包含:
算術(shù)語句
算術(shù)運算符 +(加號), - (減號), / (除號), ^ (冪), * (乘號), % (系數(shù))用于格式:
表達式 運算符 表達式
這樣語句為:
$2 = $1 ^ 3
將***個升為三次方的字段的值指定給第二個字段。
一元語句
一元 -(減號)和一元 +(加號)如在 C 編程語言中操作:
+Expression 或 -Expression
增量和減量語句
增量前語句和減量前語句如在 C 編程語言中操作:
++Variable 或 --Variable
增量后語句和減量后語句如在 C 編程語言中操作:
Variable++ 或 Variable--
賦值語句
賦值運算符 +=(加)、-=(減)、/=(除)和 *=(乘)如在 C 編程語言中操作,格式為:
Variable += Expression
Variable -= Expression
Variable /= Expression
Variable *= Expression
例如,語句:
$1 *= $2
將字段變量 $1 乘以字段變量 $2,然后將新值指定給 $1。
賦值運算符 ^=(冪)和 %=(系數(shù))具有以下格式:
Variable1^=Expression1
和
Variable2%=Expression2
并且它們等同于 C 編程語言語句:
Variable1=pow(Variable1, Expression1)
和
Variable2=fmod(Variable2, Expression2)
其中 pow 是 pow 子例程而 fmod 是 fmod 子例程。
字符串串聯(lián)語句
字符串值可以通過緊挨著陳述來串聯(lián)。例如:
$3 = $1 $2
將字段變量 $1 和 $2 中的字符串的串聯(lián)指定給字段變量 $3。
內(nèi)置函數(shù)
awk 命令語言使用算術(shù)函數(shù)、字符串函數(shù)和一般函數(shù)。如果打算編寫一個文件,且稍后在同一個程序里讀取它,則 close 子例程語句是必需的。
算術(shù)函數(shù)
以下算術(shù)函數(shù)執(zhí)行與 C 語言中名稱相同的子例程相同的操作:
atan2( y, x )返回 y/x 的反正切。
cos( x )返回 x 的余弦;x 是弧度。
sin( x )返回 x 的正弦;x 是弧度。
exp( x )返回 x 冪函數(shù)。
log( x )返回 x 的自然對數(shù)。
sqrt( x )返回 x 平方根。
int( x )返回 x 的截斷至整數(shù)的值。
rand( )返回任意數(shù)字 n,其中 0 <= n < 1。
srand( [Expr] )將 rand 函數(shù)的種子值設(shè)置為 Expr 參數(shù)的值,或如果省略 Expr 參數(shù)則使用某天的時間。返回先前的種子值。
字符串函數(shù)
字符串函數(shù)是:
gsub( Ere, Repl, [ In ] )除了正則表達式所有具體值被替代這點,它和 sub 函數(shù)完全一樣地執(zhí)行,。
sub( Ere, Repl, [ In ] )用 Repl 參數(shù)指定的字符串替換 In 參數(shù)指定的字符串中的由 Ere
參數(shù)指定的擴展正則表達式的***個具體值。sub 函數(shù)返回替換的數(shù)量。出現(xiàn)在 Repl 參數(shù)指定的字符串中的 &(和符號)由 In 參數(shù)指定的與
Ere 參數(shù)的指定的擴展正則表達式匹配的字符串替換。如果未指定 In 參數(shù),缺省值是整個記錄($0 記錄變量)。
index( String1, String2 )在由 String1 參數(shù)指定的字符串(其中有出現(xiàn) String2 指定的參數(shù))中,返回位置,從
1 開始編號。如果 String2 參數(shù)不在 String1 參數(shù)中出現(xiàn),則返回 0(零)。
length [(String)]返回 String 參數(shù)指定的字符串的長度(字符形式)。如果未給出 String 參數(shù),則返回整個記錄的長度($0
記錄變量)。
blength [(String)]返回 String 參數(shù)指定的字符串的長度(以字節(jié)為單位)。如果未給出 String
參數(shù),則返回整個記錄的長度($0 記錄變量)。
substr( String, M, [ N ] )返回具有 N 參數(shù)指定的字符數(shù)量子串。子串從 String 參數(shù)指定的字符串取得,其字符以 M
參數(shù)指定的位置開始。M 參數(shù)指定為將 String 參數(shù)中的***個字符作為編號 1。如果未指定 N,則子串的長度將是 M 參數(shù)指定的位置到
String 參數(shù)的末尾 的長度。
match( String, Ere )在 String 參數(shù)指定的字符串(Ere 參數(shù)指定的擴展正則表達式出現(xiàn)在其中)中返回位置(字符形式),從
1 開始編號,或如果 Ere 參數(shù)不出現(xiàn),則返回 0(零)。RSTART 特殊變量設(shè)置為返回值。RLENGTH
特殊變量設(shè)置為匹配的字符串的長度,或如果未找到任何匹配,則設(shè)置為 -1(負(fù)一)。
split( String, A, [Ere] )將 String 參數(shù)指定的參數(shù)分割為數(shù)組元素 A[1], A[2], . . .,
A[n],并返回 n 變量的值。此分割可以通過 Ere 參數(shù)指定的擴展正則表達式進行,或用當(dāng)前字段分隔符 FS 特殊變量)來進行(如果沒有給出
Ere 參數(shù))。除非上下文指明特定的元素還應(yīng)具有一個數(shù)字值,否則 A 數(shù)組中的元素用字符串值來創(chuàng)建。
tolower( String )返回 String 參數(shù)指定的字符串,字符串中每個大寫字符將更改為小寫。大寫和小寫的映射由當(dāng)前語言環(huán)境的
LC_CTYPE 范疇定義。
toupper( String )返回 String 參數(shù)指定的字符串,字符串中每個小寫字符將更改為大寫。大寫和小寫的映射由當(dāng)前語言環(huán)境的
LC_CTYPE 范疇定義。
sprintf(Format, Expr, Expr, . . . )根據(jù) Format 參數(shù)指定的 printf 子例程格式字符串來格式化
Expr 參數(shù)指定的表達式并返回***生成的字符串。
一般函數(shù)
一般函數(shù)是:
close( Expression )用同一個帶字符串值的 Expression 參數(shù)來關(guān)閉由 print 或 printf 語句打開的或調(diào)用
getline 參數(shù)打開的文件或管道。如果文件或管道成功關(guān)閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,并稍后在同一個程序中讀取文件,則
close 語句是必需的。
system(Command )執(zhí)行 Command 參數(shù)指定的命令,并返回出口狀態(tài)。等同于 system 子例程。
Expression | getline [ Variable ]從來自 Expression
參數(shù)指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,并將該記錄的值指定給 Variable 參數(shù)指定的變量。如果當(dāng)前未打開江
Expression 參數(shù)的值作為其命令名稱的流,則創(chuàng)建流。創(chuàng)建的流等同于調(diào)用 popen 子例程,此時 Command 參數(shù)取
Expression 參數(shù)的值且 Mode 參數(shù)設(shè)置為一個是 r 的值。只要流保留打開且 Expression 參數(shù)求得同一個字符串,則對
getline 函數(shù)的每次后續(xù)調(diào)用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設(shè)置為從流讀取的記錄。
getline [ Variable ] < Expression從 Expression 參數(shù)指定的文件讀取輸入的下一個記錄,并將
Variable 參數(shù)指定的變量設(shè)置為該記錄的值。只要流保留打開且 Expression 參數(shù)對同一個字符串求值,則對 getline
函數(shù)的每次后續(xù)調(diào)用讀取另一個記錄。如果未指定 Variable 參數(shù),則 $0 記錄變量和 NF 特殊變量設(shè)置為從流讀取的記錄。
getline [ Variable ]將 Variable 參數(shù)指定的變量設(shè)置為從當(dāng)前輸入文件讀取的下一個輸入記錄。如果未指定 Variable
參數(shù),則 $0 記錄變量設(shè)置為該記錄的值,還將設(shè)置 NF、NR 和 FNR 特殊變量。
注:所有 getline 函數(shù)的格式對于成功輸入返回 1,對于文件結(jié)束返回零,對于錯誤返回 -1。
用戶定義的函數(shù)
用戶定義的函數(shù)以下列格式說明:
function Name (Parameter, Parameter,...) { Statements }
函數(shù)可以指向 awk 命令程序中的任何位置,且它的使用可以優(yōu)先于它的定義。此函數(shù)的作用域是全局的。
函數(shù)參數(shù)可以是標(biāo)量或數(shù)組。參數(shù)名稱對函數(shù)而言是本地的;所有其它變量名稱都是全局的。同一個名稱不應(yīng)用作不同的實體;例如,一個參數(shù)不能即用作函數(shù)名稱又用作特殊變量。具有全局作用域的變量不應(yīng)共享一個函數(shù)的名稱。同個作用域中的標(biāo)量和數(shù)組不應(yīng)具有同一個名稱。
函數(shù)定義中的參數(shù)數(shù)量不必和調(diào)用函數(shù)時使用的參數(shù)數(shù)量匹配。多余的形式參數(shù)可用作本地變量。額外的標(biāo)量初始化后具有等同于空字符串和數(shù)字值為
0(零)的字符串值;額外的數(shù)組參數(shù)初始化為空數(shù)組。
當(dāng)調(diào)用函數(shù)時,函數(shù)名稱和左括號之間沒有空格。函數(shù)調(diào)用可以是嵌套的或循環(huán)的。從任何嵌套的或循環(huán)函數(shù)函數(shù)調(diào)用返回時,所有調(diào)用函數(shù)的參數(shù)的值應(yīng)保持不變,除了引用傳送的數(shù)組參數(shù)。return
語句可用于返回一個值。
在函數(shù)定義內(nèi),在左 { (花括號) 之前和右 } (花括號) 之后的換行字符是可選的。
函數(shù)定義的一個示例是:
function average ( g,n)
{
for (i in g)
sum=sum+g[i]
avg=sum/n
return avg
}
數(shù)組 g 和變量 n 以及數(shù)組中的元素個數(shù)傳遞給函數(shù) average。然后函數(shù)獲得一個平均值并返回它。
條件語句
awk 命令編程語言中的大部分條件語句和 C 編程語言中的條件語句具有相同的語法和功能。所有條件語句允許使用{ } (花括號)
將語句組合在一起??梢栽跅l件語句的表達式部分和語句部分之間使用可選的換行字符,且換行字符或 ;(分號)用于隔離 { } (花括號) 中的多個語句。C
語言中的六種條件語句是:
if需要以下語法:
if ( Expression ) { Statement } [ else Action ]
while需要以下語法:
while ( Expression ) { Statement }
for需要以下語法:
for ( Expression ; Expression ; Expression ) { Statement }
break當(dāng) break 語句用于 while 或 for 語句時,導(dǎo)致退出程序循環(huán)。
continue當(dāng) continue 語句用于 while 或 for 語句時,使程序循環(huán)移動到下一個迭代。
awk 命令編程語言中的五種不遵循 C 語言規(guī)則的條件語句是:
for...in需要以下語法:
for ( Variable in Array ) { Statement }
for...in 語句將 Variable 參數(shù)設(shè)置為 Array 變量的每個索引值,一次一個索引且沒有特定的順序,并用每個迭代來執(zhí)行
Statement 參數(shù)指定的操作。請參閱 delete 語句以獲得 for...in 語句的示例。
if...in需要以下語法:
if ( Variable in Array ) { Statement }
if...in 語句搜索是否存在的 Array 元素。如果找到 Array 元素,就執(zhí)行該語句。
delete需要以下語法:
delete Array [ Expression ]
delete 語句刪除 Array 參數(shù)指定的數(shù)組元素和 Expression 參數(shù)指定的索引。例如,語句:
for (i in g)
delete g[i];
將刪除 g[] 數(shù)組的每個元素。
exit需要以下語法:
exit [Expression]
exit 語句首先調(diào)用所有 END 操作(以它們發(fā)生的順序),然后以 Expression 參數(shù)指定的出口狀態(tài)終止 awk 命令。如果 exit
語句在 END 操作中出現(xiàn),則不調(diào)用后續(xù) END 操作。
#需要以下語法:
# Comment
# 語句放置注釋。注釋應(yīng)始終以換行字符結(jié)束,但可以在一行上的任何地方開始。
next停止對當(dāng)前輸入記錄的處理,從下一個輸入記錄繼續(xù)。
輸出語句
awk 命令編程語言的兩種輸出語句是:
print需要以下語法:
print [ ExpressionList ] [ Redirection ] [ Expression ]
print 語句將 ExpressionList 參數(shù)指定的每個表達式的值寫至標(biāo)準(zhǔn)輸出。每個表達式由 OFS 特殊變量的當(dāng)前值隔開,且每個記錄由
ORS 特殊變量的當(dāng)前值終止。
可以使用 Redirection 參數(shù)重定向輸出,此參數(shù)可指定用 >(大于號)、>>(雙大于號)和
|(管道)進行的三種輸出重定向。Redirection 參數(shù)如果重定向輸出,而 Expression 參數(shù)是文件的路徑名稱(當(dāng)
Redirection 參數(shù)是 > 或 >> 時)或命令的名稱(當(dāng) Redirection 參數(shù)是 | 時)。
printf需要以下語法:
printf Format [ , ExpressionList ] [ Redirection ] [ Expression ]
printf 語句將 ExpressionList 參數(shù)指定的表達式以 Format 參數(shù)指定的格式寫至標(biāo)準(zhǔn)輸出。除了 c
轉(zhuǎn)換規(guī)范(%c)不同外,printf 語句和 printf 命令起完全相同的作用。Redirection 和 Expression 參數(shù)與在
print 語句中起相同的作用。
對于 c
轉(zhuǎn)換規(guī)范:如果自變量具有一個數(shù)字值,則編碼是該值的字符將輸出。如果值是零或不是字符集中的任何字符的編碼,則行為未定義。如果自變量不具有數(shù)字值,則輸出字符串值的***個字符;如果字符串不包含任何字符,則行為未定義。
注:如果 Expression 參數(shù)為 Redirection 參數(shù)指定一個路徑名稱,則 Expression 參數(shù)將括在雙引號中以確保將它當(dāng)作字符串對待。
變量
變量可以是標(biāo)量、字段變量、數(shù)組或特殊變量。變量名稱不能以數(shù)字開始。
變量可僅用于引用。除了函數(shù)參數(shù)以外,它們沒有明確說明。未初始化的標(biāo)量變量和數(shù)組元素具有一個為 0(零)的數(shù)字值和一個為空字符串(" ")的字符串值。
根據(jù)上下文,變量呈現(xiàn)出數(shù)字或字符串值。每個變量可以具有數(shù)字值和/或字符串值。例如:
x = "4" + "8"
將值 12 指定給變量 x。對于字符串常量,表達式應(yīng)括在 " "(雙引號)中。
數(shù)字和字符串間沒有顯式轉(zhuǎn)換。要促使將表達式當(dāng)作一個數(shù)字,向它添加 0(零)。要促使將表達式當(dāng)作一個字符串,則添加一個空字符串(" ")。
字段變量
字段變量由 $(美元符號)后跟一個數(shù)字或數(shù)字表達式來表示。記錄中的***個字段指定為 $1 變量,第二個字段指定為 $2,以次類推。$0
字段變量指定給整個記錄。新字段可以通過指定一個值給它們來創(chuàng)建。將一個值指定給不存在的字段(即任何大于 $NF
字段變量的當(dāng)前值的字段)將促使創(chuàng)建任何干擾字段(指定為空字符串),增加 NF 特殊變量的值,并促使重新計算 $0 記錄變量。新字段由當(dāng)前字段分隔符(FS
特殊變量的值)隔開??崭窈吞袷侨笔∽侄畏指舴?。要更改字段分隔符,請使用 -F 標(biāo)志或 在 awk 命令程序中為 FS 特殊變量指定另一個值。
數(shù)組
數(shù)組初始為空且它們大小可動態(tài)更改。數(shù)組由一個變量和在 [ ](方括號)中的下標(biāo)來表示。下標(biāo)或元素標(biāo)識符可以是幾個字符串,它們提供了一種相關(guān)數(shù)組能力。例如,程序:
/red/ { x["red"]++ }
/green/ { y["green"]++ }
增加 red 計數(shù)器和 green 計數(shù)器的計數(shù)。
數(shù)組可以用一個以上的下標(biāo)來建立索引,類似于一些編程語言中的多維數(shù)組。因為 awk 命令的編程數(shù)組實際上一維的,通過串聯(lián)各獨立表達式的字符串值(每個表達式由
SUBSEP 環(huán)境變量的值隔開)來將以逗號隔開的下標(biāo)轉(zhuǎn)換為單個字符串。所以,以下兩個索引操作是等同的:
x[expr1, expr2,...exprn]
和
x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]
當(dāng)使用 in 運算符時,一個多維 Index 值應(yīng)包含在圓括號之中。除了 in 運算符,任何對不存在數(shù)組元素的引用將自動創(chuàng)建該元素。
特殊變量
以下變量對于 awk 命令具有特殊含義:
ARGCARGV 數(shù)組中的元素個數(shù)。此值可以更改。
ARGV其每個成員包含 File 變量之一或 Assignment 變量之一的數(shù)組按序從命令行取出,并從 0(零)編號至 ARGC
-1。當(dāng)每個輸入文件完成時,ARGV 數(shù)組的下一個成員提供下一個輸入文件的名稱,除非:
下一個成員是 Assignment 語句,這種情況下對賦值求值。
下一個成員具有空值,這種情況下跳過該成員。程序可以通過設(shè)置 ARGV 數(shù)組的包含該輸入文件的成員設(shè)置為一個空值來跳過所選的輸入文件。
下一個成員是 ARGV [ARGC -1] 的當(dāng)前值,awk 命令將此成員解釋為輸入文件的末尾。
CONVFMT將數(shù)字轉(zhuǎn)換為字符串的 printf 格式(除了使用 OFMT 特殊變量的輸出語句)。缺省值為“%.6g”。
ENVIRON表示運行 awk 命令的環(huán)境的數(shù)組。該數(shù)組的每個元素在以下格式中:
ENVIRON [ "Environment VariableName" ] = EnvironmentVariableValue
當(dāng) awk 命令開始執(zhí)行時設(shè)置這些值,且到執(zhí)行結(jié)束前一直使用該變量,不考慮 ENVIRON 特殊變量的任何修改。
FILENAME當(dāng)前輸入文件的路徑名稱。在執(zhí)行 BEGIN 操作的過程中,F(xiàn)ILENAME 的值未定義。在執(zhí)行 END
操作的過程中,該值是處理的***一個輸入文件的名稱。
FNR當(dāng)前文件中的當(dāng)前輸入記錄的個數(shù)。
FS輸入字段分隔符。缺省值是空格。如果輸入字段分隔符是空格,則任何數(shù)目的語言環(huán)境定義的空格可以分隔字段。FS 特殊變量可以有兩種附加的值:
如果 FS 設(shè)置為單個字符,則字段由該字符的每個單個具體值隔開。
如果 FS 位置為一個擴展正則表達式,則字段由與擴展正則表達式匹配的每個序列的具體值隔開。
NF當(dāng)前記錄中的字段個數(shù),***數(shù) 99 個。在 BEGIN 操作中,除非先前發(fā)出不帶 Variable 參數(shù)的 getline 函數(shù),否則 NF
特殊變量未定義。在 END 操作中,除非在輸入 END 操作之前發(fā)出不帶 Variable 參數(shù)的后續(xù)的、重定向的 getline 函數(shù),否則 NF
特殊變量保留它為讀取的***一個記錄而具有的值。
NR當(dāng)前輸入記錄的個數(shù)。在 BEGIN 操作中,NR 特殊變量的值是 0(零)。在 END 操作中,值是***處理的記錄的編號。
OFMT在輸出語句中將數(shù)字轉(zhuǎn)換為字符串的 printf 格式。缺省值為“%.6g”。
OFS輸出字段分隔符(缺省值是空格)。
ORS輸出記錄分隔符(缺省值是換行字符)。
RLENGTH由 match 函數(shù)來匹配的字符串的長度。
RS輸入記錄分隔符(缺省值是換行字符)。如果 RS
特殊變量為空,則記錄以一個或多個空行的序列隔開;***個空行或***一個空行在輸入的開始和結(jié)束都不會產(chǎn)生空記錄;換行字符始終是一個字段分隔符,不考慮
FS 特殊變量的值。
RSTART由 match 函數(shù)來匹配的字符串的起始位置,從 1 開始編號。等同于 match 函數(shù)的返回值。
SUBSEP隔開多個下標(biāo)。缺省值是 \031。
標(biāo)志
-f ProgramFile從 ProgramFile 變量指定的文件獲取 awk 命令的指令。如果多次指定 -f
標(biāo)志,則文件的串聯(lián)(按指定的順序)將用作指令集。
-F Ere請使用 Ere 變量指定的擴展正則表達式作為字段分隔符。缺省字段分隔符是空格。
-v Assignment將值指定給 awk 命令編程語言的變量。Assignment 參數(shù)的格式是 Name = Value。Name
部分指定變量的名稱并可以是任何下劃線、數(shù)字或字母字符的組合,但它必須以字母字符或下劃線開頭。Value
部分也由下劃線、數(shù)字和字母數(shù)字組成,且前面和后面都有一個 "(雙引號字符,類似于字符串值)。如果 Value 部分是數(shù)字,則也將為變量指定數(shù)字值。
-v 標(biāo)志指定的賦值在執(zhí)行 awk 命令程序的任何部分之前發(fā)生,包含 BEGIN 節(jié)。
Assignment將值指定給 awk 命令編程語言的變量。該值和帶有 -v 標(biāo)志的 Assignment
變量具有相同的格式和功能(除了兩者處理的時間不同以外)。Assignment 參數(shù)在處于命令行時跟在其后的輸入文件(由 File
變量指定)之前處理。如果指定 Assignment 參數(shù)僅優(yōu)先于多個輸入文件的***個,則賦值在 BEGIN 節(jié)后(如果有)就處理。如果
Assignment 參數(shù)出現(xiàn)在***一個文件后,則在 END 節(jié)(如果有)之前處理賦值。如果不指定輸入文件,則當(dāng)讀取了標(biāo)準(zhǔn)輸入時處理賦值。
File指定包含要處理的輸入的文件的名稱。如果不指定 File 變量,或指定了 -(減號),則處理標(biāo)準(zhǔn)輸入。
'Program'包含 awk 命令的指令。如果不指定 -f 標(biāo)志,Program 變量應(yīng)該是命令行上的***個項。它應(yīng)括在 ' '(單引號)中。
出口狀態(tài)
該命令返回以下出口值:
0成功完成。
>0發(fā)生錯誤。
可以通過使用 exit [ Expression ] 條件語句來更改程序中的出口狀態(tài)。
示例
要顯示長于 72 個字符的文件的行,請輸入:
awk 'length >72' chapter1
這選擇 chapter1 文件中長于 72 個字符的每一行,并將這些行寫至標(biāo)準(zhǔn)輸出,因為未指定 Action。制表符以 1 個字符計數(shù)。
要顯示字 start 和 stop 之間的所有行,包含“start”和“stop”,請輸入:
awk '/start/,/stop/' chapter1
要運行一個處理文件 chapter1 的 awk 命令程序 sum2.awk,請輸入:
awk -f sum2.awk chapter1
以下程序,sum2.awk,計算了輸入文件 chapter1 中的第二列的數(shù)字的總和與平均值:
{
sum += $2
}
END {
print "Sum: ", sum;
print "Average:", sum/NR;
}
***個操作將每行的第二個字段的值添加至變量 sum。當(dāng)***次被引用時,所有的變量都初始化為數(shù)字值 0(零)。第二個操作前的模式 END
使那些操作在讀取了所有輸入文件之后才執(zhí)行。用于計算平均值的 NR 特殊變量是一個指定已經(jīng)讀取的記錄的個數(shù)的特殊變量。
要以相反順序打印前兩個字段,請輸入:
awk '{ print $2, $1 }' chapter1
以下 awk 的程序 sum3.awk 打印文件 chapter2
的前兩個字段(輸入字段由逗號和/或空格和跳格隔開),然后合計***列的數(shù)字,并打印出總和與平均值:
BEGIN {FS = ",|[ \t]+"}
{print $1, $2}
{s += $1}
END {print "sum is",s,"average is", s/NR }
#p#
NAME
awk - pattern-directed scanning and processing language
SYNOPSIS
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ... ]
DESCRIPTION
Awk scans each input file for lines that match any of a set of patterns
specified literally in prog or in one or more files specified as -f
progfile. With each pattern there can be an associated action that
will be performed when a line of a file matches the pattern. Each line
is matched against the pattern portion of every pattern-action state-
ment; the associated action is performed for each matched pattern. The
file name - means the standard input. Any file of the form var=value
is treated as an assignment, not a filename, and is executed at the
time it would have been opened if it were a filename. The option -v
followed by var=value is an assignment to be done before prog is exe-
cuted; any number of -v options may be present. The -F fs option
defines the input field separator to be the regular expression fs.
An input line is normally made up of fields separated by white space,
or by regular expression FS. The fields are denoted $1, $2, ..., while
$0 refers to the entire line. If FS is null, the input line is split
into one field per character.
A pattern-action statement has the form
pattern { action }
A missing { action } means print the line; a missing pattern always
matches. Pattern-action statements are separated by newlines or semi-
colons.
An action is a sequence of statements. A statement can be one of the
following:
if( expression ) statement [ else statement ]
while( expression ) statement
for( expression ; expression ; expression ) statement
for( var in array ) statement
do statement while( expression )
break
continue
{ [ statement ... ] }
expression # commonly var = expression
print [ expression-list ] [ > expression ]
printf format [ , expression-list ] [ > expression ]
return [ expression ]
next # skip remaining patterns on this input line
nextfile # skip rest of this file, open next, start at top
delete array[ expression ]# delete an array element
delete array # delete all elements of array
exit [ expression ] # exit immediately; status is expression
Statements are terminated by semicolons, newlines or right braces. An
empty expression-list stands for $0. String constants are quoted " ",
with the usual C escapes recognized within. Expressions take on string
or numeric values as appropriate, and are built using the operators + -
* / % ^ (exponentiation), and concatenation (indicated by white space).
The operators ! ++ -- += -= *= /= %= ^= > >= < <= == != ?: are also
available in expressions. Variables may be scalars, array elements
(denoted x[i]) or fields. Variables are initialized to the null
string. Array subscripts may be any string, not necessarily numeric;
this allows for a form of associative memory. Multiple subscripts such
as [i,j,k] are permitted; the constituents are concatenated, separated
by the value of SUBSEP.
The print statement prints its arguments on the standard output (or on
a file if >file or >>file is present or on a pipe if |cmd is present),
separated by the current output field separator, and terminated by the
output record separator. file and cmd may be literal names or paren-
thesized expressions; identical string values in different statements
denote the same open file. The printf statement formats its expression
list according to the format (see printf(3)). The built-in function
close(expr) closes the file or pipe expr. The built-in function
fflush(expr) flushes any buffered output for the file or pipe expr.
The mathematical functions exp, log, sqrt, sin, cos, and atan2 are
built in. Other built-in functions:
length the length of its argument taken as a string, or of $0 if no
argument.
rand random number on (0,1)
srand sets seed for rand and returns the previous seed.
int truncates to an integer value
substr(s, m, n)
the n-character substring of s that begins at position m counted
from 1.
index(s, t)
the position in s where the string t occurs, or 0 if it does
not.
match(s, r)
the position in s where the regular expression r occurs, or 0 if
it does not. The variables RSTART and RLENGTH are set to the
position and length of the matched string.
split(s, a, fs)
splits the string s into array elements a[1], a[2], ..., a[n],
and returns n. The separation is done with the regular expres-
sion fs or with the field separator FS if fs is not given. An
empty string as field separator splits the string into one array
element per character.
sub(r, t, s)
substitutes t for the first occurrence of the regular expression
r in the string s. If s is not given, $0 is used.
gsub same as sub except that all occurrences of the regular expres-
sion are replaced; sub and gsub return the number of replace-
ments.
sprintf(fmt, expr, ... )
the string resulting from formatting expr ... according to the
printf(3) format fmt
system(cmd)
executes cmd and returns its exit status
tolower(str)
returns a copy of str with all upper-case characters translated
to their corresponding lower-case equivalents.
toupper(str)
returns a copy of str with all lower-case characters translated
to their corresponding upper-case equivalents.
The ``function'' getline sets $0 to the next input record from the cur-
rent input file; getline <file sets $0 to the next record from file.
getline x sets variable x instead. Finally, cmd | getline pipes the
output of cmd into getline; each call of getline returns the next line
of output from cmd. In all cases, getline returns 1 for a successful
input, 0 for end of file, and -1 for an error.
Patterns are arbitrary Boolean combinations (with ! || &&) of regular
expressions and relational expressions. Regular expressions are as
defined in re_format(7). Isolated regular expressions in a pattern
apply to the entire line. Regular expressions may also occur in rela-
tional expressions, using the operators ~ and !~. /re/ is a constant
regular expression; any string (constant or variable) may be used as a
regular expression, except in the position of an isolated regular
expression in a pattern.
A pattern may consist of two patterns separated by a comma; in this
case, the action is performed for all lines from an occurrence of the
first pattern though an occurrence of the second.
A relational expression is one of the following:
expression matchop regular-expression
expression relop expression
expression in array-name
(expr,expr,...) in array-name
where a relop is any of the six relational operators in C, and a
matchop is either ~ (matches) or !~ (does not match). A conditional is
an arithmetic expression, a relational expression, or a Boolean combi-
nation of these.
The special patterns BEGIN and END may be used to capture control
before the first input line is read and after the last. BEGIN and END
do not combine with other patterns.
Variable names with special meanings:
CONVFMT
conversion format used when converting numbers (default %.6g)
FS regular expression used to separate fields; also settable by
option -Ffs.
NF number of fields in the current record
NR ordinal number of the current record
FNR ordinal number of the current record in the current file
FILENAME
the name of the current input file
RS input record separator (default newline)
OFS output field separator (default blank)
ORS output record separator (default newline)
OFMT output format for numbers (default %.6g)
SUBSEP separates multiple subscripts (default 034)
ARGC argument count, assignable
ARGV argument array, assignable; non-null members are taken as file-
names
ENVIRON
array of environment variables; subscripts are names.
Functions may be defined (at the position of a pattern-action state-
ment) thus:
function foo(a, b, c) { ...; return x }
Parameters are passed by value if scalar and by reference if array
name; functions may be called recursively. Parameters are local to the
function; all other variables are global. Thus local variables may be
created by providing excess parameters in the function definition.
EXAMPLES
length($0) > 72
Print lines longer than 72 characters.
{ print $2, $1 }
Print first two fields in opposite order.
BEGIN { FS = ",[ \t]*|[ \t]+" }
{ print $2, $1 }
Same, with input fields separated by comma and/or blanks and
tabs.
{ s += $1 }
END { print "sum is", s, " average is", s/NR }
Add up first column, print sum and average.
/start/, /stop/
Print all lines between start/stop pairs.
BEGIN { # Simulate echo(1)
for (i = 1; i < ARGC; i++) printf "%s ", ARGV[i]
printf "\n"
exit }
SEE ALSO
lex(1), sed(1)
A. V. Aho, B. W. Kernighan, P. J. Weinberger, The AWK Programming Lan-
guage, Addison-Wesley, 1988. ISBN 0-201-07981-X
BUGS
There are no explicit conversions between numbers and strings. To
force an expression to be treated as a number add 0 to it; to force it
to be treated as a string concatenate "" to it.
The scope rules for variables in functions are a botch; the syntax is
worse.
awk(1)