awk为shell变量分配$ 1列,并用命令输出替换$ 1

时间:2016-01-11 15:11:18

标签: bash shell awk

某些命令输出是:

192.168.0.1 value1
192.168.0.2 value2
192.168.0.3 value3
192.168.0.4 value4

我需要将它传递给awk并用主机名替换IP,我已经开始使用它了。使用下一个命令:

$ knife search node -i public_ipv4:192.168.0.1

server1

所以我需要将$ 1列的cmd输出值分配给$ ip变量并将其传递给knod cmd,因为 ip = $ 1

$ cmd |awk -v ip=$1 -v name="$(knife search node -i public_ipv4:$ip)" '{$1=name}1'

期待输出:

server1 value1
server2 value2
server3 value3
server4 value4

我该怎么做?

2 个答案:

答案 0 :(得分:4)

使用readprocess substitution在shell中处理它会更容易:

while read -r ip val; do
   echo "$(knife search node -i public_ipv4:$ip) $val"
done < <(cmd)

awk命令-v ip=$1中无法正常工作,因为$1是动态awk值,它将针对每一行更改,并且无法使用-v name=value参数使用。

答案 1 :(得分:1)

您可以使用awk&#39; getline功能:

command | awk '{"knife search node -i public_ipv4:"$1 | getline h; print h, $2}' 

上述命令执行knife命令并将其输出读入变量h