码迷,mamicode.com
首页 > 其他好文 > 详细

awk(四)高级篇

时间:2014-07-17 20:19:12      阅读:250      评论:0      收藏:0      [点我收藏+]

标签:master   管道   换行符   

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

bubuko.com,布布扣

bubuko.com,布布扣



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

awk(四)高级篇,布布扣,bubuko.com

awk(四)高级篇

标签:master   管道   换行符   

原文地址:http://lixcto.blog.51cto.com/4834175/1439550

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!