awk程式中允許呼叫Shell指令. 並提供管道解決awk與系統間資料傳遞的問題. 所以awk很容易使用系統資源.主要有兩種方式:
a. 文法] awk output 指令 | "Shell 接受的命令"( 如 : print $1,$2 | "sort -k 1" )
[b. 文法] "Shell 接受的命令" | awk input 指令( 如 : "ls " | getline)
注 :
awk input 指令只有 getline 一個.
awk output 指令有 print, printf() 二個.
在a 文法中, awk所輸出的資料將轉送往 Shell , 由 Shell 的命令進行處理.以上例而言, print 所輸出的資料將經由 Shell 命令 "sort -k 1" 排序後再送往螢幕(stdout).
上例awk程式中, "print$1, $2" 可能反覆執行很多次, 其輸出的結果將先暫存於 pipe 中,等到該程式結束時, 才會一併進行 "sort -k 1".
須注意二點 :
1、不論 print $1, $2 被執行幾次, "sort -k 1" 的執行時間是 "awk程式結束時",
2、"sort -k 1" 的執行次數是 "一次".
在 b 文法中, awk將先調用 Shell 命令. 其執行結果將通過 pipe 送入awk程式,以上例而言, awk先讓 Shell 執行 "ls",Shell 執行後將結果存於 pipe, awk指令 getline再從 pipe 中讀取資料.
使用本文法時應留心: 以上例而言,awk "立刻"調用 Shell 來執行 "ls", 執行次數是一次.
getline 則可能執行多次(若pipe中存在多行資料).
例子:對進程PID進行排序
ps -ef|awk '{print $2|"sort -n"}'
將awk的結果pid值,存到pipe中當程式結束時一次性傳給“sort -n”來進行排序,並輸出到標準輸出,此外可以調用close(“sort -n”)來關閉“sort -n”前的pipe並立刻將“sort -n”交給shell執行。
例子:列印線上人數
awk 'BEGIN{while ("who"|getline) n++;print n}'
列印當前的在線上人數
說明:awk不一定要處理檔案,BEGIN會在尚未開啟任何輸入檔案前,被執行一次,awk把“|”管道符號前面的字串當成shell上的命令,並將命令送往shell,執行結果則由pipe送進awk程式中,getline為awk的提供的輸入指令
文法 |
由何處讀取資料 |
資料讀入後置於 |
getline var < file |
所指定的 file |
變數 var(var省略時,表示置於$0) |
getline var |
pipe 變數 |
變數 var(var省略時,表示置於$0) |
當Pattern 為 BEGIN 或 END 時, getline 將由 stdin 讀取資料, 否則由awk正處理的資料檔案上讀取資料.
getline 一次讀取一行資料, 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到檔案結束(EOF), 則return 0(false)