awk getline命令解析

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

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

[email protected]:~/bash/awk$ seq 10 | awk '{getline; print $0}'
2
4
6
8
10

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

[email protected]:~/bash/awk$ seq 10 | awk '{print $0; getline}'
1
3
5
7
9

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

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

[email protected]:~/bash/awk$ seq 10 | awk '{getline tmp; print tmp; print $0}'
2
1
4
3
6
5
8
7
10
9

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

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

[email protected]:~/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得到系统的当前时间。

[email protected]:~/bash/awk$ awk 'BEGIN {"date" | getline; close("date"); print $0}'
Tue May 10 07:50:51 PDT 2016
时间: 2024-08-30 10:55:13

awk getline命令解析的相关文章

awk常用命令

转自:http://www.cnblogs.com/repository/archive/2011/05/13/2045927.html ———————————————————————————————————————————————————— awk 用法:awk ' pattern {action} ' 变量名 含义 ARGC 命令行变元个数 ARGV 命令行变元数组 FILENAME 当前输入文件名 FNR 当前文件中的记录号 FS 输入域分隔符,默认为一个空格 RS 输入记录分隔符 NF

闲云控制台(一)控制台命令解析框架

发布闲云控制台连载系列,会不定期加入新功能~ 先发一个命令解析的框架 /************************************************** *******************闲云万能控制台********************* ********* ********* 作者: 闲云野鹤 ********* QQ: 836663997 ********* QQ群: 116920287 欢迎加入 ********* 邮箱: [email protected]

linux 命令解析2

基本命令  uname -a -s hostname显示主机名若是要永久生效,则编辑以下文件  #vim /etc/sysconfig/network    ssh远程登录#ssh 10.1.1.54 (是以root用户登录的)  #ssh [email protected](是以tom身份登录)  #ssh -Y 10.1.1.54(可以启动图形界面的远程登陆) scp远程拷贝  #scp 10.1.1.54:/etc/passwd /tmp/test(将目的地址10.1.1.54上的/etc

liunx 命令解析1

RHEL5.3安装光盘主要文件内容:ClusterClusterStorageimagesisolinuxServerVT showmount -e 10.1.1.20显示指定的主机可供挂载的目录 将U盘作为引导盘dd if=diskboot.img of=/dev/sdb CTRL + SHIFT + T增加终端标签 常用的shell  cat /etc/shells    /bin/sh   /bin/bash   /sbin/nologin   /bin/tcsh   /bin/csh 

ASA 8.0命令解析

有些朋友对配防火墙还是有问题,其实配置ASA防火墙很简单,常用的命令有hostname.interface(ip address.no shutdown.nameif.security-level).nat.global.route.static.access-list.access-group. 下面来解析一台ASA 8.0的配置 ASA Version 8.0(2)  //注意版本,8.3以后NAT命令有所变化!hostname ciscoasa   //主机名domain-name san

linux awk(9)命令详解

简介 awk是一个强大的文本分析工具,相对于grep的查找,sed的编辑,awk在其对数据分析并生成报告时,显得尤为强大.简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每行切片,切开的部分再进行各种分析处理. awk有3个不同版本: awk.nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本. awk其名称得自于它的创始人 Alfred Aho .Peter Weinberger 和 Brian Kernighan 姓氏的首个字母.实际上 AWK

Linux中的命令解析

命令解析: [[email protected]~]# []                  没有特殊意义 root:             当前登录用户(管理员用户) @                 没有特殊含义 localhost      主机名 ~                  代表当前所在(~家目录) #                  代表当前登录用户是管理员 $                  如果是$则表示普通用户 ----------- 关于文件 格式: 命令

Linux c 开发 - Memcached源码分析之命令解析(2)

前言 从我们上一章<Linux c 开发 - Memcached源码分析之基于Libevent的网络模型>我们基本了解了Memcached的网络模型.这一章节,我们需要详细解读Memcached的命令解析. 我们回顾上一章发现Memcached会分成主线程和N个工作线程.主线程主要用于监听accpet客户端的Socket连接,而工作线程主要用于接管具体的客户端连接. 主线程和工作线程之间主要通过基于Libevent的pipe的读写事件来监听,当有连接练上来的时候,主线程会将连接交个某一个工作线

ASA 8.4命令解析

前面发表了一篇文章是ASA 8.0版本的,后面用到8.4发现命令有很多不一样,特发一篇8.4版本的命令可以和前面命令做对比和参考 需要注意的是 1.这边没有nat 0,也就是说到DMZ区域不需旁路. 2.如果是ASA 5505的设备,则需定义vlan端口地址然后把防火墙相应端口加入对应vlan. : ASA Version 8.4(2)                                      //版本8.4 ! hostname fw enable password 8Ry2Y