awk(四)高級篇

前面三篇總結了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的知識點,差不多就這些了。畫個圖,總結下吧,圖片界面有點大,弄成了兩半。

wKioL1PHeV3h4Lf0AAqxYutS2EE851.jpg

wKiom1PHeKfy08ZoAAqqPUKpBg0101.jpg



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章