執行 AWK 程式的幾種方式
时间:2005-07-10 来源:sunyone
執行 AWK 程式的幾種方式
建立一個簡單的AWK程式 mydump.awk, 如下 : {print} 這個程式執行時會把資料檔的內容 print 到螢幕上( 與cat功用類似 ). print 之後未接任何參數時, 表示 ``print $0''. 若欲執行該AWK程式, 來印出檔案 today_rpt1 及 today_rpt2 的內容時, 必須於 UNIX 的命令列上執行下列命令 :
- 方式一 awk -f mydump.awk today_rpt1 today_rpt2
- 方式二 awk ' print ' today_rpt1 today_rpt2第二種方式係將AWK 程式直接寫在 Shell 的命令列上, 這種方式僅適合較短的AWK程式.
- 方式三 建立如下之 shell script, 並取名為 mydisplay, awk ' # 注意 , awk 與 ' 之間須有空白隔開 {print} ' $* # 注意 , ' 與 $* 之間須有空白隔開 執行 mydisplay 之前, 須先將它改成可執行的檔案(此步驟 往後不再贅述). 請執行如下命令: $ chmod +x mydisplay 往後使用者就可直接把 mydisplay 當成指令, 來display任何檔案. 例如 : $ mydisplay today_rpt1 today_rpt2
- 在script檔案 mydisplay 中, 指令``awk''與第一個 ' 之間須有空格(Shell中並無`` awk' ''指令). 第一個 ' 用以通知 Shell 其後為AWK程式. 第二個 ' 則表示 AWK 程式結束. 故AWK程式中一律以"括住字串或字元, 而不使用 ' , 以免Shell混淆.
- $* 為 shell script中之用法, 它可用以代表命令列上 ``mydisplay 之後的所有參數''. 例如執行 : $ mydisplay today_rpt1 today_rpt2 事實上 Shell 已先把該指令轉換成 : awk ' { print} ' today_rpt1 today_rpt2 本例中, $* 用以代表 ``today_rpt1 today_rpt2''. 在Shell的語法中, 可用 $1 代表第一個參數, $2 代表第二個參數. 當不確定命令列上的 參數個數時, 可使用 $* 表之.
- AWK命令列上可同時指定多個資料檔. 以awk -f dump.awk today_rpt1 today_rpt2hf 為例 AWK會先處理today_rpt1, 再處理 today_rpt2. 此時若檔案 無法開啟, 將造成錯誤.
例如: 未存在檔案"file_no_exist", 則執行 : awk -f dump.awk file_no_exit 將產生Runtime Error(無法開啟檔案). 但某些AWK程式 ``僅'' 包含以 BEGIN 為Pattern的指令. 執行這種 AWK程式時, AWK並不須開啟任何資料檔.此時命令列上若指定 一個不存在的資料檔,並不會產生 ``無法開啟檔案''的錯誤.(事實上 AWK並未開啟該檔案) 例如執行: awk 'BEGIN {print "Hello,World!!"} ' file_no_exist 該程式中僅包含以 BEGIN 為 Pattern 之 Pattern {actions}, AWK 執行時並不會開啟任何資料檔; 故不會因不存在檔案file_no_exit而 產生 `` 無法開啟檔案''的錯誤.
- AWK會將 Shell 命令列上AWK程式(或 -f 程式檔名)之後的所有 字串, 視為將輸入AWK進行處理的資料檔檔名.
若執行AWK的命令列上 ``未指定任何資料檔檔名'', 則將stdin視為 輸入之資料來源, 直到輸入end of file( Ctrl-D )為止. 讀者可以下列程式自行測試, 執行如下命令 : $awk -f dump.awk (未接任何資料檔檔名) 或 $ mydisplay (未接任何資料檔檔名) 將會發現 : 此後鍵入的任何資料將逐行複印一份於螢幕上. 這情況 不是機器當機 ! 是因為AWK程式正處於執行中. 它正按程式指示, 將讀取資料並重新dump一次; 只因執行時未指定資料檔檔名, 故AWK 便以stdin(鍵盤上的輸入)為資料來源.
讀者可利用這個特點, 設計可與AWK程式interactive talk的程式.