我刚刚从我的shell脚本尝试了这个,结果不是预期的
REF=SEARCH_TEXT
echo "some text" | awk '/$REF/{print $2}'
即使包含文本
,它也找不到$ REF推荐!
答案 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转移到子流程,则会打印您的变量。