前面三篇总结了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/awk
close()函数
close()函数主要用来关闭,打开的文件或管道
关闭原因:
由于系统和awk双重的限制,我们只能打开一定数量的文件或管道,
awk ‘ {print|"sort > 123"} END{close("sort>123"); while((getline < "123")>0) print }‘ test
system()函数
和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