天天看點

shell學習筆記4---awk的執行順序控制(原創)

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

本文原創,轉載請注明出處、作者

如有錯誤,歡迎指正

郵箱:[email protected]

作者:czmmiao  文章出處:http://czmmiao.iteye.com/blog/1885572