next和getline
next語句從輸入檔案中讀取下一行,然後從頭開始執行awk腳本。如:
{if ($1 ~/test/){next} else {print} }
getline從整體上來說,應這麼了解它的用法:
當其左右無重定向符 | 或 < 時,getline作用于目前檔案,讀入目前檔案的下一行給其後跟的變量var或$0(無變量);應該注意到,由于awk在處理getline之前已經讀入了一行,是以getline得到的傳回結果是隔行的。
當其左右有重定向符 | 或 < 時,getline則作用于定向輸入檔案,由于該檔案是剛打開,并沒有被awk讀入一行,隻是getline讀入,那麼getline傳回的是該檔案的第一行,而不是隔行。
next和getline在awk執行過程中都用于讀取下一行資料,但他們卻有着很重要的不同。next讀取下一行之後,把控制權交給了awk腳本的頂部,及next後面的語句将被忽略,重頭執行那個awk的action,同時内置變量fnr等被重置。而getline卻沒有改變腳本的控制,讀取下一行之後,繼續運作目前的awk腳本,内置變量也不會被重置。getline執行之後,會覆寫$0的内容。
下面看看他們的具體用法和實際例子
next
$ cat file1
a 1
b 2
c 3
d 4
$ awk '{print $0;next}' file1
$ awk '{next;print $0}' file1
$ awk '{if($1~/a/)print $0;next} /b/{print $0}' file1
$ awk '{if($1~/a/)print $0;next;if($1~/b/);print $0} /b/{print $0}' file1
$ awk '{if($1~/a/)print $0;next;if($1~/b/) print $0} /b/{print $0}' file1
可以看到next後面的指令都沒有執行,awk執行傳回了指令頂部,讀取下一行資料執行相應action
getline
$ awk '{getline;print $0,nr} ' file1
a 1 2
c 3 4
a 1 6
$ awk '{print $0,nr;getline} ' file1
a 1 1
b 2 3
d 4 5$ awk '{getline;print $0,nr;getline} ' file1
d 4 5
隔行處理資料
$ awk '{print $0,nr;getline} {print $0,nr}' file1
上裡的操作順序如下
'{print $0,nr}' file1------>getline------->{print $0,nr}------->'{print $0,nr}' file1
可以看到getline的操作是讀取下一行資料到記憶體中
exit
在 awk中exit的執行有兩種情況:當exit語句不在 end中時,任何操作中的exit指令表現得如同到了檔案尾,所有模式或操作執行将停止,end模式中的操作被執行。而出現在end中的exit将導緻程式終止。退出狀态為0代表成功,非零值表示出錯。
$ awk '{if ($2>3 && $2<5) exit;else print $0,nr}' file1
參考至:http://www.chinaunix.net/old_jh/24/691456.html
http://man.lupaworld.com/content/manage/ringkee/awk.htm
http://www.cnblogs.com/chengmo/archive/2010/10/04/1842073.html
http://www.51osos.com/a/linux_centos_redhat/shellbiancheng/2010/1124/awk-getline.html
http://bbs.linuxpk.com/thread-43657-1-1.html
本文原創,轉載請注明出處、作者
如有錯誤,歡迎指正
作者:czmmiao 文章出處:http://czmmiao.iteye.com/blog/1885572