getline命令是我個人認為awk最強大的乙個命令。因為它徹底改變了awk的執行邏輯。awk本質上就是乙個for迴圈,它每次對輸入檔案的一行進行處理,然後轉而執行下一行,直到整個檔案的每一行都被執行完畢。整個過程是自動的,你無需做什麼。但是,getline命令卻可以讓你去控制迴圈。當然,getline命令執行後,awk會設定nf,nr,fnr和$0等這些內部變數。
我們先看乙個簡單的例子,列印出從1到10之間的偶數:
fengxi@ubuntu:~/bash/awk$ seq 10 | awk ''24
6810
那麼getline究竟是實現什麼功能呢?正如getline的翻譯,得到行,但是注意,得到的並不是當前行,而是當前行的下一行。以上面的例子來分析,awk首先讀取到了第一行,就是1,然後getline,就得到了1下面的第二行,就是2,因為getline之後,awk會改變對應的nf,nr,fnr和$0等內部變數,所以此時的$0的值就不再是1,而是2了,然後將它列印出來。以此類推,就可以得到上面的結果。同樣,我們可以利用getline只列印出奇數行。
fengxi@ubuntu:~/bash/awk$ seq 10 | awk ''13
579
與列印偶數行的唯一區別就是print $0和getline的順序不一樣。因為getline在print $0之後,此時的$0仍然是第一行。然後getline,$0變成了下一行2。依次類推,就列印出了奇數行。
下乙個我們換乙個難一些的,就是奇偶行對調列印,原來在奇數行的內容將其列印在偶數行,原來在偶數行的內容將其列印在奇數行。
fengxi@ubuntu:~/bash/awk$ seq 10 | awk ''21
4365
87109
上面例子將getline得到的下一行的內容放在了tmp這個變數裡,因此nf,nr,fnr和$0等內部變數並不會被改變。
另外getline也可以從另外乙個檔案中讀取內容。下面例子實現將兩個檔案的每一行都列印在一行上。
fengxi@ubuntu:~/bash/awk$ awk '' a.txt
1 62 7
3 84 9
5 10
a.txt檔案的內容為上面列印出來的第一列,b.txt檔案的內容為上面列印出來的第二列。
此外,getline也可以用來執行乙個unix命令,並得到它的輸出。下面例子通過getline得到系統的當前時間。
fengxi@ubuntu:~/bash/awk$ awk 'begin '
tue may 10 07:50:51 pdt 2016
(9)awk getline用法詳解
除了可以從標準輸入或非選項型引數所指定的檔案中讀取資料,還可以使用getline從其它各種渠道獲取需要處理的資料,它的用法有很多種。getline的返回值 為了健壯性,getline時強烈建議進行判斷。例如 上面的getline的括號盡量加上,因為getline 0表示的是輸入重定向,而不是和數值0...
解析tar命令
tar命令的用法如下。摘自 鳥哥的私房菜 tar zxcvfpp tfile sfile 引數說明 z 是否同時具有 gzip 的屬性?x 解開乙個壓縮檔案的引數指令!t 檢視 tarfile 裡面的檔案!c 建立乙個壓縮檔案的引數指令 v 壓縮的過程中顯示檔案!f 使用檔名,請留意,在 f 之後要...
iptables命令解析
宣告 本文 bbs.chinaunix.net thread 2204793 1 1.html iptables 指令 語法 iptables t table command match j target jump t引數 用來指定規則表,內建的規則表有三個,分別是 nat,mangle和filte...