分享

awk调用shell命令

 king9413 2013-05-13

在awk内部可利用管道和getline函数来调用shell命令,并可得到返回的具体结果,进行相应处理。例子如下:

1) { 

       while ( ("ls" | getline) >0 )

           print

   }

    输出当前目录下的所有文件,并打印到标准输出上。| 是管道,getline依次得到每一行的输出,赋值给$0,print打印到标准输出上

2) 如果希望将输出赋值到另外一个变量中,而不是覆盖$0,可这样改写:

   { 

      while ( ("ls" | getline name) >0 )

          print name

   }

3) system命令可以把awk内部的变量传递到外面使用,比如:

    {

        system("echo ", $1)

    }

打印$1的内容

 

 

getline为awk所提供的输入指令. 

其语法如下 : 

语法                                由何处读取数据          数据读入后置于

getline   var < file            所指定的 file               变量 var(var省略时,表示置于$0)

getline   var                     pipe 变量                    变量 var(var省略时,表示置于$0) 

 

getline 一次读取一行数据, 若读取成功则return 1, 若读取失败则return -1, 若遇到文件结束(EOF), 则return 0; 

本程序使用 getline 所 return 的数据来做为 while 判断循环停止的条件,某些awk版本较旧,并不容许使用者改变 $0 之值. 这种版的 awk 执行本程序时会产生 Error, 读者可于 getline 之后置上一个变量 (如此, getline 读进来的数据便不会被置于 $0 ), 或直接改用gawk便可解决.

 

 

awk 提供与 UNIX 用法近似的 pipe, 其记号亦为 "|". 其用法及含意如下 : 

awk程序中可接受下列两种语法: 

[a. 语法] awk output 指令 | "Shell 接受的命令" 

( 如 : print $1,$2 | "sort -k 1" ) 

[b. 语法] "Shell 接受的命令" | awk input 指令 

( 如 : "ls " | getline) 

注 : awk input 指令只有 getline 一个. 

awk output 指令有 print, printf() 二个.

 

在a 语法中, awk所输出的数据将转送往 Shell , 由 Shell 的命令进行处理.以上例而言, print 所输出的数据将经由 Shell 命令 "sort -k 1" 排序后再送往屏幕(stdout). 

上列awk程序中, "print$1, $2" 可能反复执行很多次, 其输出的结果将先暂存于 pipe 中,等到该程序结束时, 才会一并进行 "sort -k 1". 

须注意二点 : 不论 print $1, $2 被执行几次, "sort -k 1" 的执行时间是 "awk程序结束时", "sort -k 1" 的执行次数是 "一次". 

 

在 b 语法中, awk将先调用 Shell 命令. 其执行结果将通过 pipe 送入awk程序,以上例而言, awk先让 Shell 执行"ls",Shell 执行后将结果存于 pipe, awk指令 getline再从 pipe 中读取数据. 

使用本语法时应留心: 以上例而言,awk "立刻"调用 Shell 来执行 "ls", 执行次数是一次. 

getline 则可能执行多次(若pipe中存在多行数据). 

除上列 a, b 二中语法外, awk程序中其它地方如出现像 "date", "cls", "ls"... 这样的字符串, awk只把它当成一般字符串处理

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多