在awk內(nèi)部可利用管道和getline函數(shù)來調(diào)用shell命令,并可得到返回的具體結(jié)果,進(jìn)行相應(yīng)處理。例子如下:
1) {
while ( ("ls" | getline) >0 )
}
輸出當(dāng)前目錄下的所有文件,并打印到標(biāo)準(zhǔn)輸出上。| 是管道,getline依次得到每一行的輸出,賦值給$0,print打印到標(biāo)準(zhǔn)輸出上
2) 如果希望將輸出賦值到另外一個變量中,而不是覆蓋$0,可這樣改寫:
{
while ( ("ls" | getline name) >0 )
print name
}
3) system命令可以把awk內(nèi)部的變量傳遞到外面使用,比如:
{
system("echo ", $1)
}
打印$1的內(nèi)容
getline為awk所提供的輸入指令.
其語法如下 :
語法 由何處讀取數(shù)據(jù) 數(shù)據(jù)讀入后置于
getline var < file 所指定的 file 變量 var(var省略時,表示置于$0)
getline var pipe 變量 變量 var(var省略時,表示置于$0)
getline 一次讀取一行數(shù)據(jù), 若讀取成功則return 1, 若讀取失敗則return -1, 若遇到文件結(jié)束(EOF), 則return 0;
本程序使用 getline 所 return 的數(shù)據(jù)來做為 while 判斷循環(huán)停止的條件,某些awk版本較舊,并不容許使用者改變 $0 之值. 這種版的 awk 執(zhí)行本程序時會產(chǎn)生 Error, 讀者可于 getline 之后置上一個變量 (如此, getline 讀進(jìn)來的數(shù)據(jù)便不會被置于 $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所輸出的數(shù)據(jù)將轉(zhuǎn)送往 Shell , 由 Shell 的命令進(jìn)行處理.以上例而言, print 所輸出的數(shù)據(jù)將經(jīng)由 Shell 命令 "sort -k 1" 排序后再送往屏幕(stdout).
上列awk程序中, "print$1, $2" 可能反復(fù)執(zhí)行很多次, 其輸出的結(jié)果將先暫存于 pipe 中,等到該程序結(jié)束時, 才會一并進(jìn)行 "sort -k 1".
須注意二點 : 不論 print $1, $2 被執(zhí)行幾次, "sort -k 1" 的執(zhí)行時間是 "awk程序結(jié)束時", "sort -k 1" 的執(zhí)行次數(shù)是 "一次".
在 b 語法中, awk將先調(diào)用 Shell 命令. 其執(zhí)行結(jié)果將通過 pipe 送入awk程序,以上例而言, awk先讓 Shell 執(zhí)行"ls",Shell 執(zhí)行后將結(jié)果存于 pipe, awk指令 getline再從 pipe 中讀取數(shù)據(jù).
使用本語法時應(yīng)留心: 以上例而言,awk "立刻"調(diào)用 Shell 來執(zhí)行 "ls", 執(zhí)行次數(shù)是一次.
getline 則可能執(zhí)行多次(若pipe中存在多行數(shù)據(jù)).
除上列 a, b 二中語法外, awk程序中其它地方如出現(xiàn)像 "date", "cls", "ls"... 這樣的字符串, awk只把它當(dāng)成一般字符串處理