代码之家  ›  专栏  ›  技术社区  ›  Sahas

将系统命令的输出分配给变量

  •  41
  • Sahas  · 技术社区  · 16 年前

    我想运行 system 一个awk脚本中的命令,并将其输出存储在一个变量中。我一直在尝试这样做,但命令的输出总是转到shell,我无法捕获它。有什么办法吗?

    例子:

    $ date | awk --field-separator=! {$1 = system("strip $1"); /*more processing*/}
    

    应调用 strip 系统命令,而不是将输出发送到shell,应该将输出分配回 $1 以获得更多处理。现在,它将输出发送到shell并将命令的retcode分配给 1美元 .

    5 回复  |  直到 8 年前
        1
  •  53
  •   ghostdog74    16 年前

    注意:协处理是GNUawk特有的。 不管怎样,另一种选择是使用getline

    cmd = "strip "$1
    while ( ( cmd | getline result ) > 0 ) {
      print  result
    } 
    close(cmd)
    
        2
  •  26
  •   Qben    13 年前

    算出了。

    我们使用AWK Two-way I/O

    {
      "strip $1" |& getline $1
    }
    

    将$1传递给strip,getline将strip的输出返回到$1

        3
  •  25
  •   Community Mohan Dere    9 年前

    在中运行系统命令 awk 你也可以用 system() cmd | getline .

    我更喜欢 命令getline 因为它允许您将值捕获到变量中:

    $ awk 'BEGIN {"date" |  getline mydate; close("date"); print "returns", mydate}'
    returns Thu Jul 28 10:16:55 CEST 2016
    

    通常,您可以将命令设置为变量:

    awk 'BEGIN {
           cmd = "date -j -f %s"
           cmd | getline mydate
           close(cmd)
         }'
    

    注意,使用 close() 如果您有多个结果,为了防止出现“make too many open files”(打开文件过多)错误(谢谢 mateuscb 在评论中指出这一点)。


    使用 系统() ,命令输出将自动打印,您可以捕获的值是其返回代码:

    $ awk 'BEGIN {d=system("date"); print "returns", d}'
    Thu Jul 28 10:16:12 CEST 2016
    returns 0
    $ awk 'BEGIN {d=system("ls -l asdfasdfasd"); print "returns", d}'
    ls: cannot access asdfasdfasd: No such file or directory
    returns 2
    
        4
  •  6
  •   Ryan Liu    13 年前
    gawk '{dt=substr($4,2,11); gsub(/\//," ",dt); "date -d \""dt"\" +%s"|getline ts; print ts}'
    
        5
  •  2
  •   cy8g3n    8 年前

    需要处理grep输出时的有用示例:

    echo "some/path/exex.c:some text" | awk -F: '{ "basename "$1"" |& getline $1; print $1 " ==> " $2}'
    

    -F: 使用 : 作为字段分隔符

    "basename "$1"" 使用第一个字段执行shell命令

    |& getline $1 子流中shell命令的读取输出

    output:
    exex.c ==> some text