歡迎您光臨本站 註冊首頁

awk使用大全

←手機掃碼閱讀     火星人 @ 2014-03-26 , reply:0

awk是AIX和UNIX上的最強大的文字匹配搜索工具。本文詳細介紹awk的適用方法。
awk 命令的輸入
awk 命令的輸出
通過記錄和欄位的文件處理
awk 命令編程語言 :
模式
操作
變數
特殊變數
標誌
示例
說明:
在文件中查找與模式匹配的行,然後在它們上面執行特定的操作。
語法
awk [ -F Ere ] [ -v Assignment ] ... { -f ProgramFile | ' Program ' } [ [ File ... | Assignment ... ] ] ...
描述
awk 命令利用一組用戶提供的指令來將一組文件和用戶提供的擴展正則表達式比較,一次一行。然後在任何與擴展正則表達式匹配的行上執行操作。 awk 處理的最大記錄大小為 10KB。
awk 命令的模式搜索比 grep 命令的搜索更常用,且它允許用戶在輸入文本行上執行多個操作。 awk 命令編程語言不需要編譯,並允許用戶使用變數、數字函數、字元串函數和邏輯運算符。
awk 命令受到 LANG 、 LC_ALL 、 LC_COLLATE 、 LC_CTYPE 、LC_MESSAGES 、 LC_NUMERIC 、 NLSPATH 和 PATH 環境變數的影響。
awk 命令的輸入
awk 命令採取兩種類型的輸入:輸入文本文件和程序指令。
輸入文本文件
搜索和操作在輸入文本文件上執行。文件如下指定:
在命令行指定 File 變數。
修改特殊變數 ARGV 和 ARGC 。
在未提供 File 變數的情況下提供標準輸入。
如果用 File 變數指定多個文件,則文件以指定的順序處理。
程序指令
用戶提供的指令控制 awk 命令的操作。這些指令來自命令行的『Program 』變數或來自用 -f 標誌和 ProgramFile 變數一起指定的文件。如果指定多個程序文件,這些文件以指定的順序串聯,且使用指令的生成的順序。

awk 命令的輸出
awk 命令從輸入文本文件中的數據產生三種類型的輸出:
· 選定的數據可以列印至標準輸出,此輸出完全同於輸入文件。
· 輸入文件的選定部分可以更改。
· 選定數據可以更改並可列印至標準輸出,此輸出可以同於或不同於輸入文件的內容。
可以在同一個文件上執行所有三種類型的輸出。 awk 命令識別的編程語言允許用戶重定向輸出。
通過記錄和欄位的文件處理
文件以下列方式處理:
1. awk 命令掃描它的指令,並執行任何指定為在讀取輸入文件前發生的操作。
awk 編程語言中的 BEGIN 語句允許用戶指定在讀取第一個記錄前要執行的一組指令。這對於初始化特殊變數特別有用。
2. 從輸入文件讀取一個記錄。
記錄是由記錄分隔符隔開的一組數據。記錄分隔符的預設值是換行字元,它使文件中的每一行成為一個單獨的記錄。記錄分隔符可以通過設置 RS 特殊變數來更改。
3. 記錄是相對於 awk 命令的指令指定的每種模式比較。
命令指令可以指定應比較記錄內的特定欄位。預設情況下,欄位由空白區(空格或跳格)隔開。每個欄位由一個欄位變數表示。記錄中的第一個欄位指定為 $1 變數,第二個欄位指定為 $2 變數,以此類推。整個記錄指定為 $0 變數。欄位分隔符可以通過在命令行使用 -F 標誌或通過設置 FS 特殊變數來更改。FS 特殊變數可以設置為下列值:空格、單個字元或擴展正則表達式。
4. 如果一個記錄與一個模式相匹配,則任何與該模式相關的操作都在該記錄上執行。
5. 在記錄和每個模式比較且執行了所有指定操作以後,從輸入讀取下一個記錄;在從輸入文件讀取所有的記錄之前,該進程重複。
6. 如果已經指定了多個輸入文件,則下一個文件打開,且在讀取所有的輸入文件之前,該進程重複。
7. 在讀取了最後一個文件中的最後一個記錄后,awk 命令執行任何指定為在輸入處理后發生的指令。
awk 編程語言中的 END 語句允許用戶指定在讀取最後一個記錄后要執行的操作。這對於發送有關 awk 命令完成了什麼工作的消息特別有用。

awk 命令編程語言
awk 命令編程語言由以下格式的語句構成:
Pattern { Action }
如果一個記錄與指定模式相匹配,或包含與該模式匹配的欄位,則執行相關的操作。可以指定沒有操作的模式,這種情況下,包含該模式的整行寫至標準輸出。為每個輸入記錄執行指定的沒有模式的操作。
模式
在 awk 命令語言語法中使用四種類型的模式:
正則表達式
關係表達式
模式的組合
BEGIN 和 END 模式
正則表達式
aw k 命令使用的擴展正則表達式類似於 grep 或 egrep 命令使用的表達式。擴展正則表達式的最簡單的形式就是包括在斜杠中的一串字元。例如,假定一個名為 testfile 的文件具有以下內容:
smawley, andy
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
輸入以下一行命令:
awk '/smi/' testfile
將把包含 smi 字元串的具體值的所有記錄列印至標準輸出。在這個示例中, awk 命令的程序 '/smi/' 是一個沒有操作的模式。輸出是:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis
以下特殊字元用於形成擴展正則表達式:
字元 功能
+ 指定如果一個或多個字元或擴展正則表達式的具體值(在 + (加號)前)在這個字元串中,則字元串匹配。命令行:
awk '/smith+ern/' testfile
將包含字元 smit,後跟一個或多個 h 字元,並以字元 ern 結束的字元串的任何記錄列印至標準輸出。此示例中的輸出是:
smithern, harry
smithhern, anne

? 指定如果零個或一個字元或擴展正則表達式的具體值(在 ?(問號)之前)在字元串中,則字元串匹配。命令行:
awk '/smith?/' testfile
將包含字元 smit,後跟零個或一個 h 字元的實例的所有記錄列印至標準輸出。此示例中的輸出是:
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

| 指定如果以 |(垂直線)隔開的字元串的任何一個在字元串中,則字元串匹配。命令行:
awk '/allen
|
alan /' testfile
將包含字元串 allen 或 alan 的所有記錄列印至標準輸出。此示例中的輸出是:
smiley, allen
smith, alan

( ) 在正則表達式中將字元串組合在一起。命令行:
awk '/a(ll)?(nn)?e/' testfile
將具有字元串 ae 或 alle 或 anne 或 allnne 的所有記錄列印至標準輸出。此示例中的輸出是:
smiley, allen
smithhern, anne

{ m } 指定如果正好有 m 個模式的具體值位於字元串中,則字元串匹配。命令行:
awk '/l{2}/' testfile
列印至標準輸出
smiley, allen

{ m, } 指定如果至少 m 個模式的具體值在字元串中,則字元串匹配。命令行:
awk '/t{2,}/' testfile
列印至標準輸出:
smitters, alexis

{ m, n } 指定如果 m 和 n 之間(包含的 m 和 n)個模式的具體值在字元串中(其中 m <= n ),則字元串匹配。命令行:
awk '/er{1, 2}/' testfile
列印至標準輸出:
smithern, harry
smithern, anne
smitters, alexis

[ String ] 指定正則表達式與方括弧內 String 變數指定的任何字元匹配。命令行:
awk '/sm[a-h]/' testfile
將具有 sm 後跟以字母順序從 a 到 h 排列的任何字元的所有記錄列印至標準輸出。此示例的輸出是:
smawley, andy

[^ String ] 在 [ ](方括弧)和在指定字元串開頭的 ^ (插入記號) 指明正則表達式與方括弧內的任何字元 不 匹配。這樣,命令行:
awk '/sm[^a-h]/' testfile
列印至標準輸出:
smiley, allen
smith, alan
smithern, harry
smithhern, anne
smitters, alexis

~,!~ 表示指定變數與正則表達式匹配(代字型大小)或不匹配(代字型大小、感嘆號)的條件語句。命令行:
awk '$1 ~ /n/' testfile
將第一個欄位包含字元 n 的所有記錄列印至標準輸出。此示例中的輸出是:
smithern, harry
smithhern, anne

^ 指定欄位或記錄的開頭。命令行:
awk '$2 ~ /^h/' testfile
將把字元 h 作為第二個欄位的第一個字元的所有記錄列印至標準輸出。此示例中的輸出是:
smithern, harry

$ 指定欄位或記錄的末尾。命令行:
awk '$2 ~ /y$/' testfile
將把字元 y 作為第二個欄位的最後一個字元的所有記錄列印至標準輸出。此示例中的輸出是:
smawley, andy
smithern, harry

. (句號) 表示除了在空白末尾的終端換行字元以外的任何一個字元。命令行:
awk '/a..e/' testfile
將具有以兩個字元隔開的字元 a 和 e 的所有記錄列印至標準輸出。此示例中的輸出是:
smawley, andy
smiley, allen
smithhern, anne

* (星號) 表示零個或更多的任意字元。命令行:
awk '/a.*e/' testfile
將具有以零個或更多字元隔開的字元 a 和 e 的所有記錄列印至標準輸出。此示例中的輸出是:
smawley, andy
smiley, allen
smithhern, anne
smitters, alexis

\ (反斜杠) 轉義字元。當位於在擴展正則表達式中具有特殊含義的任何字元之前時,轉義字元除去該字元的任何特殊含義。例如,命令行:
/a\/\//
將與模式 a // 匹配,因為反斜杠否定斜杠作為正則表達式定界符的通常含義。要將反斜杠本身指定為字元,則使用雙反斜杠。有關反斜杠及其使用的更多信息,請參閱以下關於轉義序列的內容。
識別的轉義序列

awk 命令識別大多數用於 C 語言約定中的轉義序列,以及 awk 命令本身用作特殊字元的幾個轉義序列。轉義序列是:
轉義序列 表示的字元
\" \"(雙引號)標記
\/ /(斜杠)字元
\ ddd 其編碼由 1、2 或 3 位八進位整數表示的字元,其中 d 表示一個八進位數位
\\ \ ( 反斜杠 ) 字元
\a 警告字元
\b 退格字元
\f 換頁字元
\n 換行字元(請參閱以下的注)
\r 回車字元
\t 跳格字元
\v 垂直跳格
註: 除了在
gsub 、match 、split 和 sub 內置函數中,擴展正則表達式的匹配都基於輸入記錄。記錄分隔符字元(預設情況下為換行字元)不能嵌套在表達式中,且沒與記錄分隔符字元匹配的表達式。如果 記錄分隔符不是換行字元,則可與換行字元匹配。在指定的四個內置函數中,匹配基於文本字元串,且任何字元(包含記錄分隔符)可以嵌套在模式中,這樣模式與 適當的字元相匹配。然而,用 awk 命令進行的所有正則表達式匹配中,在模式使用一個或多個 NULL(空)字元將生成未定義的結果。

關係表達式
關係運算符 <(小於)、>(大於)、<=(小於或等於)、>=(大於或等於)、= =(等於)和 !=(不等於)可用來形成模式。例如,模式:
$1 < $4
將與第一個欄位小於第四個欄位的記錄匹配。關係運算符還和字元串值一起使用。例如:
$1 =! "q"
將與第一個欄位不是 q 的所有記錄匹配。字元串值還可以根據校對值匹配。例如:
$1 >= "d"
將與第一個欄位以字元 a、b、c 或 d 開頭的所有記錄匹配。如果未給出其它信息,則欄位變數作為字元串值比較。

模式的組合
可以使用三種選項組合模式:
· 範圍由兩種以 ,(逗號)隔開的模式指定。操作在每個以匹配第一個模式的記錄開始的每個記錄上執行,並通過匹配第二個模式的記錄(包含此記錄)繼續。例如:
/begin/,/end/
與包含字元串 begin 的記錄以及該記錄和包含字元串 end 之間的所有記錄(包含包括字元串 end 的記錄)匹配。
· 括弧 ( ) 將模式組合在一起。
· 布爾運算符 ||(或)&&(和)以及 !(不)將模式組合成如果它們求值為真則匹配,否則不匹配的表達式。例如,模式:
$1 == "al" && $2 == "123"
與第一個欄位是 al 且第二個欄位是 123 的記錄匹配。

BEGIN 和 END 模式
用 BEGIN 模式指定的操作在讀取任何輸入之前執行。用 END 模式指定的操作在讀取了所有輸入后執行。允許多個 BEGIN 和 END 模式,並以指定的順序處理它們。在程序語句中 END 模式可以在 BEGIN 模式之前。如果程序僅由 BEGIN 語句構成,則執行操作且不讀取輸入。如果程序僅由 END 語句構成,則在任何操作執行前讀取所有輸入。

操作
有多種類型的操作語句:
· 操作語句
· 內置函數
· 用戶定義的函數
· 條件語句
· 輸出操作
操作語句
操作語句括在 { } (花括弧) 中。如果語句指定為沒有模式,則它們在每個記錄上執行。在括弧里可以指定多個操作,但操作間必須以換行字元或 ;(分號)分隔,且語句以它們出現的順序處理。操作語句包含:
算術語句
算術運算符 +(加號), - (減號), / (除號), ^ (冪), * (乘號), % (係數)用于格式:
表達式 運算符 表達式
這樣,語句:
$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 。
賦值運算符 ^=(冪)和 %=(係數)具有以下格式:
Variable1^=Expression1

Variable2%=Expression2
並且它們等同於 C 編程語言語句:
Variable1=pow(Variable1, Expression1)

Variable2=fmod(Variable2, Expression2)
其中 pow 是 pow 子常式而 fmod 是 fmod 子常式。

字元串串聯語句
字元串值可以通過緊挨著陳述來串聯。例如:
$3 = $1 $2
將欄位變數 $1 和 $2 中的字元串的串聯指定給欄位變數 $3 。
內置函數

awk 命令語言使用算術函數、字元串函數和一般函數。如果打算編寫一個文件,且稍後在同一個程序里讀取它,則 close 子常式語句是必需的。
算術函數
以下算術函數執行與 C 語言中名稱相同的子常式相同的操作:
atan2( y , x ) 返回 y / x 的反正切。
cos( x ) 返回 x 的餘弦; x 是弧度。
sin( x ) 返回 x 的正弦; x 是弧度。
exp( x ) 返回 x 冪函數。
log( x ) 返回 x 的自然對數。
sqrt( x ) 返回 x 平方根。
int( x ) 返回 x 的截斷至整數的值。
rand( ) 返回任意數字 n ,其中 0 <= n < 1。
srand( [ Expr ] ) 將 rand 函數的種子值設置為 Expr 參數的值,或如果省略 Expr 參數則使用某天的時間。返回先前的種子值。
字元串函數

字元串函數是:
gsub( Ere , Repl , [ In ] ) 除了正則表達式所有具體值被替代這點,它和 sub 函數完全一樣地執行,。
sub( Ere , Repl , [ In ] ) 用 Repl 參數指定的字元串替換 In 參數指定的字元串中的由 Ere 參數指定的擴展正則表達式的第一個具體值。 sub 函數返回替換的數量。出現在 Repl 參數指定的字元串中的 &(和符號)由 In 參數指定的與 Ere 參數的指定的擴展正則表達式匹配的字元串替換。如果未指定 In 參數,預設值是整個記錄( $0 記錄變數)。
index( String1 , String2 ) 在由 String1 參數指定的字元串(其中有出現 String2 指定的參數)中,返回位置,從 1 開始編號。如果 String2 參數不在 String1 參數中出現,則返回 0(零)。
length [( String )] 返回 String 參數指定的字元串的長度(字元形式)。如果未給出 String 參數,則返回整個記錄的長度( $0 記錄變數)。
blength [( String )] 返回 String 參數指定的字元串的長度(以位元組為單位)。如果未給出 String 參數,則返回整個記錄的長度( $0 記錄變數)。
substr( String , M , [ N ] ) 返回具有 N 參數指定的字元數量子串。子串從 String 參數指定的字元串取得,其字元以 M 參數指定的位置開始。 M 參數指定為將 String 參數中的第一個字元作為編號 1。如果未指定 N 參數,則子串的長度將是 M 參數指定的位置到 String 參數的末尾 的長度。
match( String , Ere ) 在 String 參數指定的字元串( Ere 參數指定的擴展正則表達式出現在其中)中返回位置(字元形式),從 1 開始編號,或如果 Ere 參數不出現,則返回 0(零)。 RSTART 特殊變數設置為返回值。RLENGTH 特殊變數設置為匹配的字元串的長度,或如果未找到任何匹配,則設置為 -1(負一)。
split( String , A , [ Ere ] ) 將 String 參數指定的參數分割為數組元素 A [1], A [2], . . ., A [ n ],並返回 n 變數的值。此分隔可以通過 Ere 參數指定的擴展正則表達式進行,或用當前欄位分隔符( FS 特殊變數)來進行(如果沒有給出 Ere 參數)。除非上下文指明特定的元素還應具有一個數字值,否則 A 數組中的元素用字元串值來創建。
tolower( String ) 返回 String 參數指定的字元串,字元串中每個大寫字元將更改為小寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 範疇定義。
toupper( String ) 返回 String 參數指定的字元串,字元串中每個小寫字元將更改為大寫。大寫和小寫的映射由當前語言環境的 LC_CTYPE 範疇定義。
sprintf( Format , Expr , Expr , . . . ) 根據 Format 參數指定的 printf 子常式格式字元串來格式化 Expr 參數指定的表達式並返回最後生成的字元串。
一般函數

一般函數是:
close( Expression ) 用同一個帶字元串值的 Expression 參數來關閉由 print 或 printf 語句打開的或調用 getline 函數打開的文件或管道。如果文件或管道成功關閉,則返回 0;其它情況下返回非零值。如果打算寫一個文件,並稍後在同一個程序中讀取文件,則 close 語句是必需的。
system( Command ) 執行 Command 參數指定的命令,並返回退出狀態。等同於 system 子常式。
Expression | getline [ Variable ] 從來自 Expression 參數指定的命令的輸出中通過管道傳送的流中讀取一個輸入記錄,並將該記錄的值指定給 Variable 參數指定的變數。如果當前未打開將 Expression 參數的值作為其命令名稱的流,則創建流。創建的流等同於調用 popen 子常式,此時 Command 參數取 Expression 參數的值且 Mode 參數設置為一個是 r 的值。只要流保留打開且 Expression 參數求得同一個字元串,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變數和 NF 特殊變數設置為從流讀取的記錄。
getline [ Variable ] < Expression 從 Expression 參數指定的文件讀取輸入的下一個記錄,並將 Variable 參數指定的變數設置為該記錄的值。只要流保留打開且 Expression 參數對同一個字元串求值,則對 getline 函數的每次後續調用讀取另一個記錄。如果未指定 Variable 參數,則 $0 記錄變數和 NF 特殊變數設置為從流讀取的記錄。
getline [ Variable ] 將 Variable 參數指定的變數設置為從當前輸入文件讀取的下一個輸入記錄。如果未指定 Variable 參數,則 $0 記錄變數設置為該記錄的值,還將設置 NF 、 NR 和 FNR 特殊變數。
註: 所有getline 函數的格式對於成功輸入返回 1,對於文件結束返回零,對於錯誤返回 -1。

用戶定義的函數
用戶定義的函數以下列格式說明:
function Name (Parameter, Parameter,...) { Statements }
函數可以指向 awk 命令程序中的任何位置,且它的使用可以優先於它的定義。此函數的作用域是全局的。
函數參數可以是標量或數組。參數名稱對函數而言是本地的;所有其它變數名稱都是全局的。同一個名稱不應用作不同的實體;例如,一個參數名稱不能用作函數名稱又用作特殊變數。具有全局作用域的變數不應共享一個函數的名稱。同個作用域中的標量和數組不應具有同一個名稱。
函數定義中的參數數量不必和調用函數時使用的參數數量匹配。多餘的形式參數可用作本地變數。額外的標量參數初始化后具有等同於空字元串和數字值為 0(零)的字元串值;額外的數組參數初始化為空數組。
當調用函數時,函數名稱和左括弧之間沒有空格。函數調用可以是嵌套的或循環的。從任何嵌套的或循環函數函數調用返回時,所有調用函數的參數的值應保持不變,除了引用傳送的數組參數。 return 語句可用於返回一個值。
在函數定義內,在左 { ( 花括弧 ) 之前和右 } ( 花括弧 ) 之後的換行字元是可選的。
函數定義的一個示例是:
function average ( g,n)
{
for (i in g)
sum=sum+g
avg=sum/n
return avg
}
數組 g 和變數 n 以及數組中的元素個數傳遞給函數 average。然後函數獲得一個平均值並返回它。
條件語句
awk 命令編程語言中的大部分條件語句和 C 編程語言中的條件語句具有相同的語法和功能。所有條件語句允許使用{ } (花括弧) 將語句組合在一起。可以在條件語句的表達式部分和語句部分之間使用可選的換行字元,且換行字元或 ;(分號)用於隔離 { } (花括弧) 中的多個語句。C 語言中的六種條件語句是:
if 需要以下語法:
if ( Expression ) { Statement } [ else Action ]

while 需要以下語法:
while ( Expression ) { Statement }

for 需要以下語法:
for ( Expression ; Expression ; Expression ) { Statement }

break 當 break 語句用於 while 或 for 語句時,導致退出程序循環。
continue 當 continue 語句用於 while 或 for 語句時,使程序循環移動到下一個迭代。
awk 命令編程語言中的五種不遵循 C 語言規則的條件語句是: for...in 需要以下語法:
for ( Variable in Array ) { Statement }
for ... in 語句將 Variable 參數設置為 Array 變數的每個索引值,一次一個索引且沒有特定的順序,並用每個迭代來執行 Statement 參數指定的操作。請參閱 delete 語句以獲得 for ... in 語句的示例。

if...in 需要以下語法:
if ( Variable in Array ) { Statement }
if ... in 語句搜索是否存在的 Array 元素。如果找到 Array 元素,就執行該語句。

delete 需要以下語法:
delete Array [ Expression ]
delete 語句刪除 Array 參數指定的數組元素和 Expression 參數指定的索引。例如,語句:
for (i in g)
delete g;
將刪除 g[] 數組的每個元素。

exit 需要以下語法:
exit [ Expression ]
exit 語句首先調用所有 END 操作(以它們發生的順序),然後以 Expression 參數指定的退出狀態終止 awk 命令。如果 exit 語句在 END 操作中出現,則不調用後續 END 操作。

# 需要以下語法:
# Comment
# 語句放置註釋。註釋應始終以換行字元結束,但可以在一行上的任何地方開始。

next 停止對當前輸入記錄的處理,從下一個輸入記錄繼續。
輸出語句

awk 命令編程語言的兩種輸出語句是:
print 需要以下語法:
print [ ExpressionList ] [ Redirection ] [ Expression ]
print 語句將 ExpressionList 參數指定的每個表達式的值寫至標準輸出。每個表達式由 OFS 特殊變數的當前值隔開,且每個記錄由 ORS 特殊變數的當前值終止。
可以使用 Redirection 參數重定向輸出,此參數可指定用 >(大於號)、>>(雙大於號)和 |(管道)進行的三種輸出重定向。 Redirection 參數指定如何重定向輸出,而 Expression 參數是文件的路徑名稱(當 Redirection 參數是 > 或 >> 時)或命令的名稱(當 Redirection 參數是 | 時)。

printf 需要以下語法:
printf Format [ , ExpressionList ] [ Redirection ] [ Expression ]
printf 語句將 ExpressionList 參數指定的表達式以 Format 參數指定的格式寫至標準輸出。除了 c 轉換規範(%c)不同外, printf 語句和 printf 命令起完全相同的作用。Redirection 和 Expression 參數與在 print 語句中起相同的作用。
對於 c 轉換規範:如果自變數具有一個數字值,則編碼是該值的字元將輸出。如果值是零或不是字符集中的任何字元的編碼,則行為未定義。如果自變數不具有數字值,則輸出字元串值的第一個字元;如果字元串不包含任何字元,則行為未定義。
註: 如果

Expression 參數為 Redirection 參數指定一個路徑名稱,則 Expression 參數將括在雙引號中以確保將它當作字元串對待。

變數
變數可以是標量、欄位變數、數組或特殊變數。變數名稱不能以數字開始。
變數可僅用於引用。除了函數參數以外,它們沒有明確說明。未初始化的標量變數和數組元素具有一個為 0(零)的數字值和一個為空字元串(" ")的字元串值。
根據上下文,變數呈現出數字或字元串值。每個變數可以具有數字值和/或字元串值。例如:
x = "4" + "8"
將值 12 指定給變數 x。對於字元串常量,表達式應括在 " "(雙引號)標記中。
數字和字元串間沒有顯式轉換。要促使將表達式當作一個數字,向它添加 0(零)。要促使將表達式當作一個字元串,則添加一個空字元串(" ")。

欄位變數
欄位變數由 $ (美元符號)後跟一個數字或數字錶達式來表示。記錄中的第一個欄位指定為 $1 變數,第二個欄位指定為 $2 ,以次類推。 $0 欄位變數指定給整個記錄。新欄位可以通過指定一個值給它們來創建。將一個值指定給不存在的欄位(即任何大於 $NF 欄位變數的當前值的欄位)將促使創建任何干擾欄位(指定為空字元串),增加 NF 特殊變數的值,並促使重新計算 $0 記錄變數。新欄位由當前欄位分隔符( FS 特殊變數的值)隔開。空格和跳格是預設欄位分隔符。要更改欄位分隔符,請使用 -F 標誌或 在 awk 命令程序中為 FS 特殊變數指定另一個值。

數組
數組初始為空且它們大小可動態更改。數組由一個變數和在 [ ](方括弧)中的下標來表示。下標或元素標識符可以是幾個字元串,它們提供了一種相關數組能力。例如,程序:
/red/ { x["red"]++ }
/green/ { y["green"]++ }
增加 red 計數器和 green 計數器的計數。
數組可以用一個以上的下標來建立索引,類似於一些編程語言中的多維數組。因為 awk 命令的編程數組實際上是一維的,通過串聯各獨立表達式的字元串值(每個表達式由 SUBSEP 環境變數的值隔開)來將以逗號隔開的下標轉換為單個字元串。所以,以下兩個索引操作是等同的:
x[expr1, expr2,...exprn]

x[expr1SUBSEPexpr2SUBSEP...SUBSEPexprn]
當使用 in 運算符時,一個多維 Index 值應包含在圓括弧之中。除了 in 運算符,任何對不存在數組元素的引用將自動創建該元素。

特殊變數
以下變數對於 awk 命令具有特殊含義:
ARGC ARGV 數組中的元素個數。此值可以更改。
ARGV 其每個成員包含 File 變數之一或 Assignment 變數之一的數組按序從命令行取出,並從 0(零)編號至 ARGC -1。當每個輸入文件完成時, ARGV 數組的下一個成員提供下一個輸入文件的名稱,除非:
· 下一個成員是 Assignment 語句,這種情況下對賦值求值。
· 下一個成員具有空值,這種情況下跳過該成員。程序可以通過設置 ARGV 數組的包含該輸入文件的成員設置為一個空值來跳過所選的輸入文件。
· 下一個成員是 ARGV [ ARGC -1] 的當前值, awk 命令將此成員解釋為輸入文件的末尾。
CONVFMT 將數字轉換為字元串的 printf 格式(除了使用 OFMT 特殊變數的輸出語句)。預設值為「%.6g」。
ENVIRON 表示運行 awk 命令的環境的數組。該數組的每個元素在以下格式中:
ENVIRON [ " Environment VariableName " ] = EnvironmentVariableValue
當 awk 命令開始執行時設置這些值,且到執行結束前一直使用該環境,不考慮 ENVIRON 特殊變數的任何修改。

FILENAME 當前輸入文件的路徑名稱。在執行 BEGIN 操作的過程中, FILENAME 的值未定義。在執行 END 操作的過程中,該值是處理的最後一個輸入文件的名稱。
FNR 當前文件中的當前輸入記錄的個數。
FS 輸入欄位分隔符。預設值是空格。如果輸入欄位分隔符是空格,則任何數目的語言環境定義的空格可以分隔欄位。 FS 特殊變數可以有兩種附加的值:
· 如果 FS 設置為單個字元,則欄位由該字元的每個單個具體值隔開。
· 如果 FS 設置為一個 擴展正則表達式 ,則欄位由與擴展正則表達式匹配的每個序列的具體值隔開。
NF 當前記錄中的欄位個數,最大數 99 個。在 BEGIN 操作中,除非先前發出不帶 Variable 參數的 getline 函數,否則 NF 特殊變數未定義。在 END 操作中,除非在輸入 END 操作之前發出不帶 Variable 參數的後續的、重定向的 getline 函數,否則 NF 特殊變數保留它為讀取的最後一個記錄而具有的值。
NR 當前輸入記錄的個數。在 BEGIN 操作中, NR 特殊變數的值是 0(零)。在 END 操作中,值是最後處理的記錄的編號。
OFMT 在輸出語句中將數字轉換為字元串的 printf 格式。預設值為「%.6g」。
OFS 輸出欄位分隔符(預設值是空格)。
ORS 輸出記錄分隔符(預設值是換行字元)。
RLENGTH 由 match 函數來匹配的字元串的長度。
RS 輸入記錄分隔符(預設值是換行字元)。如果 RS 特殊變數為空,則記錄以一個或多個空行的序列隔開;第一個空行或最後一個空行在輸入的開始和結束都不會產生空記錄;換行字元始終是一個欄位分隔符,不考慮 FS 特殊變數的值。
RSTART 由 match 函數來匹配的字元串的起始位置,從 1 開始編號。等同於 match 函數的返回值。
SUBSEP 隔開多個下標。預設值是 \031。
標誌

-f ProgramFile 從 ProgramFile 變數指定的文件獲取 awk 命令的指令。如果多次指定 -f 標誌,則文件的串聯(按指定的順序)將用作指令集。
-F Ere 請使用 Ere 變數指定的擴展正則表達式作為欄位分隔符。預設欄位分隔符是空格。
-v Assignment 將值指定給 awk 命令編程語言的變數。Assignment 參數的格式是 Name = Value 。Name 部分指定變數的名稱並可以是任何下劃線、數字或字母字元的組合,但它必須以字母字元或下劃線開頭。 Value 部分也由下劃線、數字和字母數字組成,且前面和後面都有一個 "(雙引號字元,類似於字元串值)。如果 Value 部分是數字,則也將為變數指定數字值。
-v 標誌指定的賦值在執行 awk 命令程序的任何部分之前發生,包含 BEGIN 節。

Assignment 將值指定給 awk 命令編程語言的變數。該值和帶有 -v 標誌的 Assignment 變數具有相同的格式和功能(除了兩者處理的時間不同以外)。Assignment 參數在處於命令行時跟在其後的輸入文件(由 File 變數指定)之前處理。如果指定 Assignment 參數僅優先於多個輸入文件的第一個,則賦值在 BEGIN 節后(如果有)就處理。如果 Assignment 參數出現在最後一個文件后,則在 END 節(如果有)之前處理賦值。如果不指定輸入文件,則當讀取了標準輸入時處理賦值。
File 指定包含要處理的輸入的文件的名稱。如果不指定 File 變數,或指定了 - (減號),則處理標準輸入。
' Program ' 包含 awk 命令的指令。如果不指定 -f 標誌,Program 變數應該是命令行上的第一個項。它應括在 ' '(單引號)中。
退出狀態

該命令返回以下出口值:
0 成功完成。
>0 發生錯誤。
可以通過使用

exit [ Expression ] 條件語句來更改程序中的退出狀態。
示例
1. 要顯示長於 72 個字元的文件的行,請輸入:
awk 'length >72' chapter1
這選擇 chapter1 文件中長於 72 個字元的每一行,並將這些行寫至標準輸出,因為未指定 Action 。製表符以 1 個字元計數。
2. 要顯示字 start 和 stop 之間的所有行,包含「start」和「stop」,請輸入:
awk '/start/,/stop/' chapter1
3. 要運行一個處理文件 chapter1 的 awk 命令程序 sum2.awk,請輸入:
awk -f sum2.awk chapter1
以下程序 sum2.awk,計算了輸入文件 chapter1 中的第二列的數字的總和與平均值:
{
sum += $2
}
END {
print "Sum: ", sum;
print "Average:", sum/NR;
}
第一個操作將每行的第二個欄位的值添加至變數 sum。當第一次被引用時,所有的變數都初始化為數字值 0(零)。第二個操作前的模式 END 使那些操作在讀取了所有輸入文件之後才執行。用於計算平均值的 NR 特殊變數是一個指定已經讀取的記錄的個數的特殊變數。
4. 要以相反順序列印前兩個欄位,請輸入:
awk '{ print $2, $1 }' chapter1
5. 以下 awk 程序
6. awk -f sum3.awk chapter2
列印文件 chapter2 的前兩個欄位(用逗號和/或空格和製表符隔開),然後合計第一列,並列印總和與平均值:
BEGIN {FS = ",|[ \t]+"}
{print $1, $2}
{s += $1}
END {print "sum is",s,"average is", s/NR }

[火星人 ] awk使用大全已經有1231次圍觀

http://coctec.com/docs/linux/show-post-183849.html