前面三篇总结了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 = $0while (getline){    if (match($0,/^puppet\?/))        break    else        commandList=commandList" "$0}print commandList}' testansible  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 toolssalt-stack also puppet?chef? I do not know

从标准输入读取,并赋值给变量。。。(注意$0并没有被替换,而是把新行赋值给变量input)

root@salt-master:~/sedAawk/awk# awk '{getline input < "-";print  }'  test1ansible  a one of its most powerful tools2salt-stack also 3puppet?4chef? 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/awkroot@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"}'12root@salt-master:~/sedAawk/awk# awk 'BEGIN{print "12"> "test111"}'

OK,awk的知识点,差不多就这些了。画个图,总结下吧,图片界面有点大,弄成了两半。