【Linux】getline解释

知识点

先说一下重要的知识点:

  • 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命令解析


技术读书笔记
个人阅读过的技术数据整理

赐他一块白石,石上写着新名

172 声望
34 粉丝
0 条评论
推荐阅读
《跟闪电侠学Netty》阅读笔记 - 开篇入门Netty
和 《Netty In Action》 不同,这本书直接从Netty入门程序代码开始引入Netty框架,前半部分教你如何用Netty搭建简易的通讯系统,整体难度比较低,后半部分直接从服务端源码、客户端源码、ChannelPipeline开始介绍...

Xander阅读 639

Laravel入门及实践,快速上手ThinkSNS+二次开发
【摘要】自从ThinkSNS+不使用ThinkPHP框架而使用Laravel框架之后,很多人都说技术门槛抬高了,其实你与TS+的距离仅仅只是学习一个新框架而已,所以,我们今天来说说Laravel的入门。

ThinkSNS1阅读 2.5k

C++编译器和链接器的完全指南
C++是一种强类型语言,它的编译和链接是程序开发过程中不可或缺的两个环节。编译器和链接器是两个非常重要的概念。本文将详细介绍C++中的编译器和链接器以及它们的工作原理和使用方法。

小万哥2阅读 1.1k

封面图
confluence7.2.1的部署与迁移---呕心沥血版
Confluence是一个专业的企业知识管理与协同软件,也可以用于构建企业wiki。使用简单,但它强大的编辑和站点管理特征能够帮助团队成员之间共享信息、文档协作、集体讨论,信息推送。 到官网下载最新版本,截止目前...

暗涌阅读 7.9k

Ubuntu 20.04 读写 Windows 10 共享目录(qbit)
本文实验环境中,Windows 操作系统版本为 Windows Server 2016,应该对 Windows 10 和 Windows Server 2019 同样适用

qbit1阅读 6.3k

Ubuntu 20.04 搭建 Elasticsearch 7.x 小集群(qbit)
环境ES 节点硬件:3 台 AWS m5.4xlarge(16 vCPU/64GB 内存)Kibana 硬件:1 台 AWS m5.large(2 vCPU/8GB 内存)操作系统:Ubuntu 20.04 LTSElasticsearch 7.9.3Kibana 7.9.3机器示意图操作系统这里主要讲 EBS ...

qbit阅读 4.1k

ubuntu 常见操作笔记
PHP CLIsudo sed -i 's/display_errors = .*/display_errors = On/' /etc/php/7.4/cli/php.inisudo sed -i 's/error_reporting = .*/error_reporting = E_ALL/' /etc/php/7.4/cli/php.inisudo sed -i 's/memory_l...

zhiqiang1阅读 1.5k

赐他一块白石,石上写着新名

172 声望
34 粉丝
宣传栏