AWK 程式中使用 Shell 命令

AWK程式中允許呼叫Shell指令. 並提供pipe解決AWK與系統間 資料傳遞的問題. 所以AWK很容易使用系統資源. 讀者可利用這個 特色來撰寫某些適用的系統工具. 範例 : 寫一AWK程式來列印出線上人數. 將下列程式建檔, 命名為 count.awk BEGIN { while ( "who" | getline ) n++ print n } 並執行下列命令 : awk { -f} count.awk 執行結果將會印出目前線上人數 說 明 :
  1. AWK 程式並不一定要處理資料檔. 以本例而言, 僅輸入程式 檔count.awk, 未輸入任何資料檔.
  2. BEGIN 和 END 同為AWK中之種一 Pattern. 以 BEGIN 為 Pattern之Actions,只有在AWK開始執行程式,尚未開啟任何輸入 檔前, 被執行一次.(注意: 只被執行一次 )
  3. ``{ |}'' 為 AWK 中表示 pipe的符號. AWK 把 pipe之前的字串 ''who''當成Shell上的命令, 並將該命令送往Shell執行, 執行的結果 (原先應於螢幕印出者)則藉由pipe送進AWK程式中.
  4. getline為AWK所提供的輸入指令. 其語法如下 :
    語法由何處讀取資料資料讀入後置於
    getline var < file 所指定的 file變數 var(var省略時,表示置於$0)
    getline var pipe 變數 var(var省略時,表示置於$0)
    getline var 見 註一 變數 var(var省略時,表示置於$0)
    註一 : 當 Pattern 為 BEGIN 或 END 時, getline 將由 stdin 讀取資料, 否則由AWK正處理的資料檔上讀取資料. getline 一次讀取一行資料, 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到檔案結束(EOF), 則return 0; 本程式使用 getline 所 return 的資料 來做為 while 判斷 迴圈停止的條件,某些AWK版本較舊,並不容許使用者改變 $0 之值. 這種版的 AWK 執行本程式時會產生 Error, 讀者可於 getline 之後 置上一個變數 (如此, getline 讀進來的資料便不會被置於 $0 ), 或直接改用gawk便可解決.