前面三篇總結了awk的基本結構,常用系統變量,流程控制,和函數。
這一篇總結下awk剩餘的一些話題。
getline函數
getline函數是從輸入,標準輸入,文件或管道讀取另一行
getline和next有點類似,它倆都導致下一個輸入行被讀取。不同的,next語句將控制返回到腳本的頂部。而getline得到新的一行,但沒有改變腳本的控制。
next類似於sed中命令d。
而getline函數則類似於sed中命令N,不過和N還是有點小區別的。
sed中的N命令,是讀取新行,舊行和新行之間用換行符連接。而getline函數作用後,舊行將消失了,新行將被賦值爲$0,同時awk會同步NF,NR,FNR等內置變量,新行將作爲當前行。。。。。當然也是有個例外的,就是當getline的結果賦值給一個變量的時候,$0仍未舊行,不會被新讀入的行替代
getline函數返回值
1 如果能夠正常讀取一行
0 如果到了文件末尾
-1 如果遇到錯誤
注意:getline函數的調用,是直接用getline,而不是getline()
來個小例子,實現把某行之前的行,連接爲一行
root@salt-master:~/sedAawk/awk# awk ' NR==1 {if (match($0,/^puppet\?/)) { commandList = $0 print commandList exit 0 } } {commandList = $0 while (getline){ if (match($0,/^puppet\?/)) break else commandList=commandList" "$0 } print commandList}' test ansible is one of the most powerful tools salt-stack also
從文件中讀取
root@salt-master:~/sedAawk/awk# awk 'BEGIN{while(getline < "test") print}' ansible a one of its most powerful tools salt-stack also puppet? chef? I do not know
從標準輸入讀取,並賦值給變量。。。(注意$0並沒有被替換,而是把新行賦值給變量input)
root@salt-master:~/sedAawk/awk# awk '{getline input < "-";print }' test 1 ansible a one of its most powerful tools 2 salt-stack also 3 puppet? 4 chef? I do not know
從管道中讀取(讀取結果也可以賦值給變量)
root@salt-master:~/sedAawk/awk# awk 'BEGIN{"which awk"| getline input;print input }'/usr/bin/awk
close()函數
close()函數主要用來關閉,打開的文件或管道
關閉原因:
由於系統和awk雙重的限制,我們只能打開一定數量的文件或管道,
awk ' {print|"sort > 123"} END{close("sort>123"); while((getline < "123")>0) print }' test
system()函數
和python中的os.system類似。
執行一個表達式給出的命令,但是沒有提供可供程序處理的輸出。只會返回程序執行的狀態。執行成功的狀態下返回0,錯誤的情況下返回非0數值
root@salt-master:~/sedAawk/awk# awk 'BEGIN{system("which awk")}' /usr/bin/awk root@salt-master:~/sedAawk/awk# awk ' BEGIN{if (system("test " test000)) system("mkdir test000") }'
直接向文件和管道輸出
重定向操作符>或>>,和shell中的一樣
root@salt-master:~/sedAawk/awk# awk 'BEGIN{print "2\n1"|"sort"}' 1 2 root@salt-master:~/sedAawk/awk# awk 'BEGIN{print "12"> "test111"}'
OK,awk的知識點,差不多就這些了。畫個圖,總結下吧,圖片界面有點大,弄成了兩半。