在awk內部可利用管道和getline函數來調用shell命令,并可得到返回的具體結果,進行相應處理。例子如下:
1) {
while ( ("ls" | getline) >0 )
}
輸出當前目錄下的所有文件,并打印到標準輸出上。| 是管道,getline依次得到每一行的輸出,賦值給$0,print打印到標準輸出上
2) 如果希望將輸出賦值到另外一個變量中,而不是覆蓋$0,可這樣改寫:
{
while ( ("ls" | getline name) >0 )
print name
}
3) system命令可以把awk內部的變量傳遞到外面使用,比如:
{
system("echo ", $1)
}
打印$1的內容
getline為awk所提供的輸入指令.
其語法如下 :
語法 ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?由何處讀取數據 ? ? ? ? ?數據讀入后置于
getline ? var < file ? ? ? ? ? ?所指定的 file ? ? ? ? ? ? ??變量 var(var省略時,表示置于$0)
getline ??var ? ? ? ? ? ? ? ? ? ? pipe 變量 ? ? ? ? ? ? ? ? ? ?變量 var(var省略時,表示置于$0)
getline 一次讀取一行數據, 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到文件結束(EOF), 則return 0;
本程序使用 getline 所 return 的數據來做為 while 判斷循環停止的條件,某些awk版本較舊,并不容許使用者改變 $0 之值. 這種版的 awk 執行本程序時會產生 Error, 讀者可于 getline 之后置上一個變量 (如此, getline 讀進來的數據便不會被置于 $0 ), 或直接改用gawk便可解決.
awk 提供與 UNIX 用法近似的 pipe, 其記號亦為 "|". 其用法及含意如下 :
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".
須注意二點 : 不論 print $1, $2 被執行幾次, "sort -k 1" 的執行時間是 "awk程序結束時", "sort -k 1" 的執行次數是 "一次".
在 b 語法中, awk將先調用 Shell 命令. 其執行結果將通過 pipe 送入awk程序,以上例而言, awk先讓 Shell 執行"ls",Shell 執行后將結果存于 pipe, awk指令 getline再從 pipe 中讀取數據.
使用本語法時應留心: 以上例而言,awk "立刻"調用 Shell 來執行 "ls", 執行次數是一次.
getline 則可能執行多次(若pipe中存在多行數據).
除上列 a, b 二中語法外, awk程序中其它地方如出現像 "date", "cls", "ls"... 這樣的字符串, awk只把它當成一般字符串處理