红联Linux门户
Linux帮助

awk getline命令解析

发布时间:2016-05-22 10:44:01来源:linux网站作者:冯西的技术博客

getline命令是我个人认为awk最强大的一个命令。因为它彻底改变了awk的运行逻辑。awk本质上就是一个for循环,它每次对输入文件的一行进行处理,然后转而执行下一行,直到整个文件的每一行都被执行完毕。整个过程是自动的,你无需做什么。但是,getline命令却可以让你去控制循环。当然,getline命令执行后,awk会设置NF,NR,FNR和$0等这些内部变量。


我们先看一个简单的例子,打印出从1到10之间的偶数:

fengxi@ubuntu:~/bash/awk$ seq 10 | awk '{getline; print $0}' 
2



10 


那么getline究竟是实现什么功能呢?正如getline的翻译,得到行,但是注意,得到的并不是当前行,而是当前行的下一行。以上面的例子来分析,awk首先读取到了第一行,就是1,然后getline,就得到了1下面的第二行,就是2,因为getline之后,awk会改变对应的NF,NR,FNR和$0等内部变量,所以此时的$0的值就不再是1,而是2了,然后将它打印出来。以此类推,就可以得到上面的结果。同样,我们可以利用getline只打印出奇数行。

fengxi@ubuntu:~/bash/awk$ seq 10 | awk '{print $0; getline}' 





与打印偶数行的唯一区别就是print $0和getline的顺序不一样。因为getline在print $0之后,此时的$0仍然是第一行。然后getline,$0变成了下一行2。依次类推,就打印出了奇数行。


下一个我们换一个难一些的,就是奇偶行对调打印,原来在奇数行的内容将其打印在偶数行,原来在偶数行的内容将其打印在奇数行。

fengxi@ubuntu:~/bash/awk$ seq 10 | awk '{getline tmp; print tmp; print $0}' 








10 


上面例子将getline得到的下一行的内容放在了tmp这个变量里,因此NF,NR,FNR和$0等内部变量并不会被改变。


另外getline也可以从另外一个文件中读取内容。下面例子实现将两个文件的每一行都打印在一行上。

fengxi@ubuntu:~/bash/awk$ awk '{printf "%s ", $0; getline < "b.txt"; print $0}' a.txt  
1 6 
2 7 
3 8 
4 9 
5 10 

a.txt文件的内容为上面打印出来的第一列,b.txt文件的内容为上面打印出来的第二列。


此外,getline也可以用来执行一个UNIX命令,并得到它的输出。下面例子通过getline得到系统的当前时间。

fengxi@ubuntu:~/bash/awk$ awk 'BEGIN {"date" | getline; close("date"); print $0}' 
Tue May 10 07:50:51 PDT 2016


本文永久更新地址:http://www.linuxdiyf.com/linux/20852.html