在AWK中使用bash变量

时间:2010-12-23 14:02:30

标签: bash scripting awk

我刚刚从我的shell脚本尝试了这个,结果不是预期的

REF=SEARCH_TEXT
echo "some text" | awk '/$REF/{print $2}'

即使包含文本

,它也找不到$ REF

推荐!

3 个答案:

答案 0 :(得分:40)

不要在shell中引用游戏,而是使用-v选项将shell变量作为awk变量传递:

awk -v ref="$REF" 'match($0, ref) {print $2}'

如果$REF只是文字而不是正则表达式,请使用index()函数代替match()

答案 1 :(得分:16)

你的问题是措辞真的差......

无论如何,我想你想要这个:

REF=SEARCH_TEXT
echo "some text" | awk "/$REF/{print \$2}"

请注意$2和双引号的转义。

或者这个:

REF=SEARCH_TEXT
echo "some text" | awk "/$REF/"'{print $2}'

请注意明智地使用双引号和单引号,并且$2上没有转义。

你必须使用shell扩展,否则它将包含导出shell变量并在awk环境中使用它 - 在这种情况下 overkill

export REF=SEARCH_TEXT
echo "some text" | awk '{if (match($0, ENVIRON["REF"])) print $2}'

我认为awk不支持/.../ guard中的变量。 如果我错了,请纠正我。

答案 2 :(得分:1)

gawk中,您拥有ENVIRON数组,例如awk 'END{print ENVIRON["REF"]}' /dev/null如果您export将其从shell转移到子流程,则会打印您的变量。