getline用法详解
在默认情况下,awk支持从文件或者STDIN中读取数据。我们也可以使用getline来灵活读取数据,例如在main代码块执行过程中读取某个非待处理文件的数据,或者从某个读取某个shell命令结果数据。
getline有返回值:1:正确读取到了数据。
0:读取数据遇到EOF。
负数:读取遇到了错误。-1表示文件无法打开,-2表示IO操作需要重试。遇到错误时还会使用变量ERRNO来描述错误。
为了awk代码的健壮性,在使用getline的时候,一般会加上条件判断。if((getline)<0){...}
if((getline)<=0){...}
if((getline)>0){...}
记得将getline使用小括号包裹,否则getline<0会被识别为输入重定向而不是大小判断。
无参数的getline
getline无参数时表示立即从当前数据流(文件或者STDIN)中读取下一条记录保存至$0。做字段分割。然后从getline的位置继续向后执行awk代码。
此时getline会设置$0、位置参数($1...$NF)、NR、FNR和RT。# awk '/^1/{print;getline;print}' a.txt
1 Bob male 28 abc@qq.com 18023394012
2 Alice female 24 def@gmail.com 18084925203
10 Bruce female 27 bcbd@139.com 13942943905
10 Bruce female 27 bcbd@139.com 13942943905
记住,print省略参数表示print $0。从输出结果来看,第4行比较诡异。因为Bruce那行已经是文件的末尾,此时再getline会遇到EOF,返回值为0。$0不做修改,依然是Bruce那行。因此Bruce那行输出了两次。
所以我们最好是对getline做条件判断,增强代码健壮性。# awk '/^1/{print;if((getline)<=0){exit};print}' a.txt
1 Bob male 28 abc@qq.com 18023394012
2 Alice female 24 def@gmail.com 18084925203
10 Bruce female 27 bcbd@139.com 13942943905
awk中有另外一个指令类似于getline,叫next,我们先来看执行结果。# awk '/^1/{print;next;print}' a.txt
1 Bob male 28 abc@qq.com 18023394012
10 Bruce female 27