3.5 相關工具awk

3.5.1 什麼是awk

AWK 是一種程式語言. 它具有一般程式語言常見的功能.AWK語言具有某些特點, 使用直譯器(Interpreter)不需先行編譯; 變數無型別之分(Typeless) 可使用文字當陣列的註標(Associative Array)...等特色. 因此, 使用AWK撰寫程式比起使用其它語言更簡潔便利且節省時間. AWK還具有一些內建功能, 使得AWK擅於處理具資料列(Record) 欄位(Field)型態的資料; 此外, AWK內建有pipe的功能, 可將處理中的資料傳送給外部的 Shell命令加以處理, 再將Shell命令處理後的資料傳回AWK程式, 這個特點也使得AWK程式很容易使用系統資源.

    由於AWK具有上述特色, 在問題處理的過程, 可輕易使用AWK來撰寫一些小工具; 這些小工具並非用來解決整個大問題,它們只個別扮演解決問題過程的某些角色, 可藉由Shell所提供的pipe將資料按需要傳送給不同的小工具進行處理, 以解決整個大問題. 這種解題方式, 使得這些小工具可因不同需求而被重覆組合及使用(reuse); 也可藉此方式來先行測試大程式原型的可行性與正確性, 將來若需要較高的執行速度時再用C語言來改寫. 這是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。若是處理的過程中沒有Patternawk會無條件的去執行Actions

 

c.工作流程: 執行awk時, 它會反複進行下列四步驟。

1. 自動從指定的資料檔中讀取一筆資料列。

2. 自動更新(Update)相關的內建變數之值。

3. 逐次執行程式中 所有的 Pattern { Actions } 指令。

4. 當執行完程式中所有 Pattern { Actions }時,若資料檔中還有未讀取的料,則反覆執行步驟1到步驟4

 

awk會自動重覆進行上述的四個步驟,所以不須在程式中寫這個迴圈


回上一頁