3.5.1 什麼是awk?
AWK 是一種程式語言. 它具有一般程式語言常見的功能.因AWK語言具有某些特點, 如 : 使用直譯器(Interpreter)不需先行編譯; 變數無型別之分(Typeless), 可使用文字當陣列的註標(Associative Array)...等特色. 因此, 使用AWK撰寫程式比起使用其它語言更簡潔便利且節省時間. AWK還具有一些內建功能, 使得AWK擅於處理具資料列(Record), 欄位(Field)型態的資料; 此外, AWK內建有pipe的功能, 可將處理中的資料傳送給外部的 Shell命令加以處理, 再將Shell命令處理後的資料傳回AWK程式, 這個特點也使得AWK程式很容易使用系統資源.
3.5.2 如何取得 AWK?
一般的UNIX作業系統, 本身即附有AWK. 不同的UNIX作業系統所附的AWK其版本亦不盡相同. 若讀者所使用的系統上未附有AWK, 可透過 anonymous ftp 到下列地方取得 :
phi.sinica.edu.tw:/pub/gnu
ftp.edu.tw:/UNIX/gnu
prep.ai.mit.edu:/pub/gnu
3.5.3 AWK如何運作?
為便於解釋awk程式架構,以及相關的術語,筆者就以上面trace file為例,來加以介紹。
a.名詞定義:
1. 資料列:awk從資料檔上讀取的基本單位,以trace file為例,
awk讀入的
第一筆為 ”+ 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0”
第二筆為 “- 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0”
一般而言,一筆資料列相當於資料檔上的一列資料。
2. 欄位(Field):為資料列上被分隔開的子字串。
以”+ 0.1 1 2 cbr 1000 ------- 2 1.0 3.1 0 0”為例,
一 |
二 |
三 |
四 |
五 |
六 |
七 |
八 |
九 |
十 |
十一 |
十二 |
+ |
0.1 |
1 |
2 |
cbr |
1000 |
------- |
2 |
1.0 |
3.1 |
0 |
0 |
一般而言是以空白字元來分隔相鄰的欄位。
當awk讀入資料列後,會把每個欄位的值存入欄位變數。
欄位變數 |
意義 |
$0 |
為一字串, 其內容為目前awk所讀入的資料列. |
$1 |
代表 $0 上第一個欄位的資料. |
$2 |
代表 $0 上第二欄個位的資料. |
…… |
…… |
b.程式主要節構:
Pattern1 { Actions1 }
Pattern2 { Actions2 }
……………………………
Pattern3 { Actions3 }
一般常用”關係判斷式”來當成Pattern。例如:
x > 3 用來判斷變數x是否大於3
x == 5 用來判斷變數x是否等於5
awk提供c語言常見關係運算元,如:>、<、>=、<=、==、!
Actions是由許多awk指令所構成,而awk的指令與c語言中的指令非常類似。
IO指令:print 、 printf( ) 、getline ......
流程控制指令 : if ( ...) {...} else {…}、 while(…){…} ……
在awk程式的流程為先判斷Pattern的結果,若為True則執行相對應的Actions,若為False則不執行相對的Actions。若是處理的過程中沒有Pattern,awk會無條件的去執行Actions。
c.工作流程: 執行awk時, 它會反複進行下列四步驟。
1. 自動從指定的資料檔中讀取一筆資料列。
2. 自動更新(Update)相關的內建變數之值。
3. 逐次執行程式中 所有的 Pattern { Actions } 指令。
4. 當執行完程式中所有 Pattern { Actions }時,若資料檔中還有未讀取的料,則反覆執行步驟1到步驟4。
awk會自動重覆進行上述的四個步驟,所以不須在程式中寫這個迴圈