关于linux:Linuxgetline解释

7次阅读

共计 1198 个字符,预计需要花费 3 分钟才能阅读完成。

知识点

先说一下重要的知识点:

  • 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}'
2
4
6
8
10

这个命令的的执行逻辑是执行一个 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;}'
1
3
5
7
9

长期变量应用

奇偶行对调打印,原来在奇数行的内容将其打印在偶数行,原来在偶数行的内容将其打印在奇数行,要实现这个性能,须要在循环中应用长期变量:

seq 10 | awk '{getline tmp; print tmp; print $0}'

后果如下:

[zxd@localhost kafka2.8.X]$ seq 10 | awk '{getline tmp; print tmp; print $0}'
2
1
4
3
6
5
8
7
10
9

文件合并

在下面的例子当中 tmp 变量是不会扭转的。

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

vim b.txt
1
2
3
4
5
vim c.txt
5
6
7
8
9
10
[zxd@localhost ~]$ awk '{printf"%s ", $0; getline <"c.txt"; print $0}' b.txt 
1 6
2 7
3 8
4 9
5 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 命令解析

正文完
 0