快收藏! 30 分钟包你学会 AWK( 四 )


快收藏! 30 分钟包你学会 AWK

文章插图
管道
除了将输出重定向到文件之外 , 我们还可以将输出重定向到其它程序 , 与shell中一样 , 我们可以使用管道操作符 |。
快收藏! 30 分钟包你学会 AWK

文章插图
第一次I/O操作使用了 |& 操作符 , gawk会创建一个到运行其它程序的子进程的双向管道 ,  print 的输出被写入到了 subprogram 的标准输入 , 而这个 subprogram 的标准输出在gawk中使用 getline 函数进行读取 。
注意:目前协同进程的标准错误输出将会和gawk的标准错误输出混杂在一起 , 无法单独获取标准错误输出 。另外 , I/O缓冲可能存在问题 , gawk程序会自动的刷新所有输出到下游的协同进程的管道 。但是 , 如果协同进程没有刷新其标准输出的话 , gawk将可能会在使用 getline 函数从协同进程读取输出的时候挂起 , 这就可能引起死锁 。
我们可以使用 close 函数关闭双向管道的 to或者 from一端 , 这两个字符串值告诉gawk发送数据到协同进程完成时或者从协同进程读取完毕时关闭管道 。在使用系统命令 sort 的时候是这样做是非常必要的 , 因为它必须等所有输出都读取完毕时才能进行排序 。
快收藏! 30 分钟包你学会 AWK

文章插图
上例看起来有些复杂 , 我们逐行分析一下
  • 首先 , 第一行 cmd = “tr [a-z] [A-Z]” 是在AWK中要建立双向连接的命令
  • 第二行的 print 命令用于为 tr 命令提供输入 , 而 |& 用于指出要建立双向连接
  • 第三行用于在上面的语句 close(cmd, “to”), 在执行完成后关闭其 to 进程
  • 第四行 cmd |& getline out 使用getline函数存储输出到变量out中
  • 最后一行使用 close 函数关闭命令
美化输出
到目前为止 , 我们已经使用过 print 和 printf 函数显示数据到标准输出 , 但是 printf 函数实际上要比我们之前使用的情况更加强大得多 。该函数是从C语言中借鉴来的 , 在处理格式化的输出时非常有用 。
快收藏! 30 分钟包你学会 AWK

文章插图
格式化输出标识有 %c  ,  %d  ,  %s 等 , 基本与C语言一致 , 这里就不多赘述了 。
执行shell命令
在AWK中执行shell命令有两种方式
  • 使用 system 函数
  • 使用管道
使用system函数
system函数用于执行操作系统命令并且返回命令的退出码到awk 。
快收藏! 30 分钟包你学会 AWK

文章插图
使用管道
如果要执行的命令很多 , 可以将输出的命令直接用管道传递给 “/bin/sh”执行
快收藏! 30 分钟包你学会 AWK

文章插图
参考
  • AWK Tutorial
  • The GNU Awk User’s Guide
本文将会持续修正和更新 , 最新内容请参考我的 GITHUB 上的 程序猿成长计划 项目 , 欢迎 Star 。
来源:伯乐在线- mylxsw




推荐阅读