首页 > 代码库 > awk(四)高级篇

awk(四)高级篇

前面三篇总结了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的知识点,差不多就这些了。画个图,总结下吧,图片界面有点大,弄成了两半。

wKioL1PHeV3h4Lf0AAqxYutS2EE851.jpg

wKiom1PHeKfy08ZoAAqqPUKpBg0101.jpg



本文出自 “西风” 博客,请务必保留此出处http://lixcto.blog.51cto.com/4834175/1439550