如何在Bourne shell中将shell变量传递给awk?

时间:2012-02-13 10:05:45

标签: awk sh

我是Bourne shell的新手,想要进行简单的数组模拟。这有效:

COLORS='FF0000 0000FF 00FF00'
i=2
color=$(echo ${COLORS} | awk '{print $2}')
echo "color selected: $color"

我想要做的是在print中传递$i而不是固定的$2参数(稍后将在循环中使用)。我花了几个小时搞清楚单引号和双引号的正确组合来做到这一点,没有运气。

我最接近的是

color=$("echo ${COLORS} | awk '{print "$"${i}}'")

运行结果是:

+ COLORS=FF0000 0000FF 00FF00
+ i=2
+ echo FF0000 0000FF 00FF00 | awk '{print $2}'
./tempgraph.sh: ./tempgraph.sh: 37: echo FF0000 0000FF 00FF00 | awk '{print $2}': not found
+ color=
+ echo color selected:
color selected:

感谢任何帮助。

4 个答案:

答案 0 :(得分:5)

不要浪费时间尝试让shell在awk命令中正确扩展变量,只需使用-v定义变量:

echo $COLORS | awk -v col=2 '{ print $col }'

i变量而言,这变为:

i=1
echo $COLORS | awk -v col=$i '{ print $col }'

答案 1 :(得分:2)

您也可以直接进入您的环境:

export COLORS='FF0000 0000FF 00FF00'
awk 'END {split(ENVIRON["COLORS"],colors);for(col in colors) { print "Color",col,"is",colors[col]}}' /dev/null

在这个mac上给出以下输出:

Color 2 is 0000FF
Color 3 is 00FF00
Color 1 is FF0000

答案 2 :(得分:1)

我这样做:

color=$(echo ${COLORS} | awk "{print \$$i}")

如果您使用'...',则不会展开内容。但是您希望在脚本中插入$i的值。所以要使用"...",它会进行变量扩展。但是你也想在AWK的数字前加$,所以你必须逃避它(\$)。

答案 3 :(得分:1)

-v foo=bar提供了BEGIN等调用分配的变量,其中分配了简单baz=qux的变量不在。{/ p>

BEGIN { print foo, bar; }
{ print foo, bar; }

看到差异:

echo Don\'t Panic! | awk -f ./hello.awk -v foo=Hello bar=World
Hello
Hello World