知识点
先说一下重要的知识点:
getline;
在awk
中能够用于管制“循环”。getline;
之后,awk会扭转对应的NF,NR,FNR和$0等外部变量getline;
拿到的是下一行而不是以后行,概念设想为++i
操作即可。
介绍
getline命令扭转了awk的运行逻辑,是awk命令不可或缺的一部分。awk实质上就是一个for循环,它每次对输出文件的一行进行解决,而后转而执行下一行,直到整个文件的每一行都被执行结束。整个过程是主动的无需做什么。
getline
命令却能够让你去管制循环。当然,getline命令执行后,awk会设置NF,NR,FNR和$0等这些外部变量。
简略应用
咱们先看一个简略的例子,打印出从1到10之间的偶数:
[zxd@localhost kafka2.8.X]$ seq 10 | awk '{getline; print $0}'246810
这个命令的的执行逻辑是执行一个for循环从1到10,在循环外部先执行getline;
而后打印$0
,$0
指向的就是以后的变量,留神getline;
获取的是获取以后行的下一行,相似咱们编程语言的++i
,留神getline;
之后,awk会扭转对应的NF,NR,FNR和$0等外部变量,所以$0
值会随着遍历扭转,最初实现打印偶数成果。
依据下面的介绍咱们能够推导出打印奇数的逻辑:
[zxd@localhost kafka2.8.X]$ seq 10 | awk '{ print $0;getline;}'13579
长期变量应用
奇偶行对调打印,原来在奇数行的内容将其打印在偶数行,原来在偶数行的内容将其打印在奇数行,要实现这个性能,须要在循环中应用长期变量:
seq 10 | awk '{getline tmp; print tmp; print $0}'
后果如下:
[zxd@localhost kafka2.8.X]$ seq 10 | awk '{getline tmp; print tmp; print $0}'21436587109
文件合并
在下面的例子当中tmp
变量是不会扭转的。
getline也能够从另外一个文件中读取内容。上面例子实现将两个文件的每一行都打印在一行上:
vim b.txt12345vim c.txt5678910[zxd@localhost ~]$ awk '{printf "%s ", $0; getline < "c.txt"; print $0}' b.txt 1 62 73 84 95 10
日期获取
getline也能够用来执行一个UNIX命令,并失去它的输入。上面例子通过getline失去零碎的以后工夫:
awk 'BEGIN {"date" | getline; close("date"); print $0}'
[zxd@localhost ~]$ awk 'BEGIN {"date" | getline; close("date"); print $0}'Wed Mar 1 00:34:01 CST 2023
参考资料
# awk getline命令解析