知识点先说重要的知识点:getline;可用于控制awk中的“循环”。获取线路;之后awk会改变对应的NF、NR、FNR、$0getline等内部变量;获取下一行而不是当前行,概念可以想象成++i操作。getline命令的引入改变了awk的运行逻辑,是awk命令的组成部分。awk本质上是一个for循环,每次处理输入文件的一行,然后执行下一行,直到整个文件的每一行都执行完。整个过程是自动的,无需任何操作。getline命令允许您控制循环。当然,getline命令执行后,awk会设置NF、NR、FNR、$0这些内部变量。简单使用先看一个简单的例子,打印出1到10的偶数:[zxd@localhostkafka2.8.X]$seq10|awk'{getline;print$0}'246810这条命令的执行逻辑是从1到10执行一个for循环,先在循环内部执行getline;然后打印$0,$0指向当前变量,注意getline;得到的是获取当前行的下一行,类似于我们编程语言i中的++,注意getline;之后awk会改变相应的NF、NR、FNR和$0等内部变量,所以$0的值会随着遍历而改变,最终达到打印偶数的效果。根据上面的介绍,我们可以推导出打印奇数的逻辑:[zxd@localhostkafka2.8.X]$seq10|awk'{print$0;getline;}'13579临时变量打印时奇偶行颠倒,本来在奇数行原来的内容会打印到偶数行,偶数行原来的内容打印在奇数线上。要实现这个功能,需要在循环中使用一个临时变量:seq10|awk'{getlinetmp;打印tmp;print$0}'结果如下:[zxd@localhostkafka2.8.X]$seq10|awk'{getlinetmp;打印tmp;print$0}'21436587109文件合并在上面的例子中,tmp变量不会改变。getline还可以从另一个文件中读取内容。以下示例将两个文件的每一行打印在一行上:vimb.txt12345vimc.txt5678910[zxd@localhost~]$awk'{printf"%s",$0;getline<"c.txt";print$0}'b.txt16273849510dateGetline也可用于执行UNIX命令并获取其输出。下面的例子通过getline获取系统的当前时间:awk'BEGIN{"date"|获取线路;关闭(“日期”);打印$0}'[zxd@localhost~]$awk'BEGIN{“日期”|获取线路;关闭(“日期”);print$0}'WedMar100:34:01CST2023参考资料#awkgetline命令分析
