在AWK中使用bash变量

veh*_*zzz 9 variables bash scripting awk escaping

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

REF=SEARCH_TEXT
echo "some text" | awk '/$REF/{print $2}'
Run Code Online (Sandbox Code Playgroud)

即使包含文本,它也没有找到$ REF

建议!

gle*_*man 44

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

awk -v ref="$REF" 'match($0, ref) {print $2}'
Run Code Online (Sandbox Code Playgroud)

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


Mar*_*gen 16

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

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

REF=SEARCH_TEXT
echo "some text" | awk "/$REF/{print \$2}"
Run Code Online (Sandbox Code Playgroud)

请注意转义$2和双引号.

或这个:

REF=SEARCH_TEXT
echo "some text" | awk "/$REF/"'{print $2}'
Run Code Online (Sandbox Code Playgroud)

请注意明智地使用双引号和单引号并且不能转义$2.

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

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

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