前面三篇总结了awk的基本结构,常用系统变量,流程控制,和函数。
这一篇总结下awk剩余的一些话题。
getline函数
getline函数是从输入,标准输入,文件或管道读取另一行
getline和next有点类似,它俩都导致下一个输入行被读取。不同的,next语句将控制返回到脚本的顶部。而getline得到新的一行,但没有改变脚本的控制。
next类似于sed中命令d。
而getline函数则类似于sed中命令N,不过和N还是有点小区别的。
sed中的N命令,是读取新行,旧行和新行之间用换行符连接。而getline函数作用后,旧行将消失了,新行将被赋值为$0,同时awk会同步NF,NR,FNR等内置变量,新行将作为当前行。。。。。当然也是有个例外的,就是当getline的结果赋值给一个变量的时候,$0仍未旧行,不会被新读入的行替代
getline函数返回值
1 如果能够正常读取一行
0 如果到了文件末尾
-1 如果遇到错误
注意:getline函数的调用,是直接用getline,而不是getline()
来个小例子,实现把某行之前的行,连接为一行
root@salt-master:~/sedAawk/awk# awk ‘
NR==1 {if (match($0,/^puppet\?/))
{ commandList = $0
print commandList
exit 0
}
}
{commandList = $0
while (getline){
if (match($0,/^puppet\?/))
break
else
commandList=commandList" "$0
}
print commandList}‘ test
ansible is one of the most powerful tools salt-stack also从文件中读取
root@salt-master:~/sedAawk/awk# awk ‘BEGIN{while(getline < "test") print}‘
ansible a one of its most powerful tools
salt-stack also
puppet?
chef? I do not know从标准输入读取,并赋值给变量。。。(注意$0并没有被替换,而是把新行赋值给变量input)
root@salt-master:~/sedAawk/awk# awk ‘{getline input < "-";print }‘ test
1
ansible a one of its most powerful tools
2
salt-stack also
3
puppet?
4
chef? I do not know从管道中读取(读取结果也可以赋值给变量)
root@salt-master:~/sedAawk/awk# awk ‘BEGIN{"which awk"| getline input;print input }‘/usr/bin/awkclose()函数
close()函数主要用来关闭,打开的文件或管道
关闭原因:
由于系统和awk双重的限制,我们只能打开一定数量的文件或管道,
awk ‘
{print|"sort > 123"}
END{close("sort>123");
while((getline < "123")>0)
print
}‘ testsystem()函数
和python中的os.system类似。
执行一个表达式给出的命令,但是没有提供可供程序处理的输出。只会返回程序执行的状态。执行成功的状态下返回0,错误的情况下返回非0数值
root@salt-master:~/sedAawk/awk# awk ‘BEGIN{system("which awk")}‘
/usr/bin/awk
root@salt-master:~/sedAawk/awk# awk ‘
BEGIN{if (system("test " test000))
system("mkdir test000")
}‘直接向文件和管道输出
重定向操作符>或>>,和shell中的一样
root@salt-master:~/sedAawk/awk# awk ‘BEGIN{print "2\n1"|"sort"}‘
1
2
root@salt-master:~/sedAawk/awk# awk ‘BEGIN{print "12"> "test111"}‘OK,awk的知识点,差不多就这些了。画个图,总结下吧,图片界面有点大,弄成了两半。
本文出自 “西风” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1439550
原文地址:http://lixcto.blog.51cto.com/4834175/1439550