将信息添加到输出 - 从shell命令执行中获取

时间:2016-03-06 16:41:38

标签: shell awk sed cmd getline

我的文件包含缩进行,例如:

table 't'
  field 'abc'
  field 'def' and @enabled=true
  field 'ghi'
table 'u'

我想将其转换为:

table 't'
  field 'abc' [info about ABC]
  field 'def' [info about DEF] and @enabled=true
  field 'ghi' [info about GHI]
table 'u'

其中括号之间的字符串来自shell脚本(get-info)的调用,它获取术语'abc','def'和'ghi'的定义。

我尝试使用AWK(通过cmd | getline output机制):

awk '$1 == "field" {
    $2 = substr($2, 2, length($2) - 2)
    cmd = "get-info \"" $2 "\" 2>&1 | head -n 1" # results or error
    while (cmd | getline output) {
        print $0 " [" output "]";
    }
    close(cmd)
    next
}
// { print $0 }'

但它不尊重缩进!

我怎么能实现我的愿望?

1 个答案:

答案 0 :(得分:0)

看起来你要做的就是:

$1 == "field" {
    cmd = "get-info \"" substr($2,2,length($2)-2) "\" 2>&1" # results or error
    if ( (cmd | getline output) > 0 ) {
        sub(/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+/,"& ["output"]")
    }
    close(cmd)
}
{ print }

请注意,您不需要head -1,只是不要在循环中读取输出。

e.g:

$ cat tst.awk
$1 == "field" {
    cmd = "echo \"--->" substr($2,2,length($2)-2) "<---\" 2>&1"
    if ( (cmd | getline output) > 0 ) {
        sub(/^[[:space:]]*[^[:space:]]+[[:space:]]+[^[:space:]]+/,"& ["output"]")
    }
    close(cmd)
}
{ print }

$ awk -f tst.awk file
table 't'
  field 'abc'
  field 'def' [--->def<---] and @enabled=true
  field 'ghi'
table 'u'

这是一个罕见的场合,使用getline可能是合适的,但如果您正在考虑使用{{1,请确保您在http://awk.info/?tip/getline阅读并理解所有getline警告再次。