不能在 awk 命令中使用 unix $variable



>我在我的unix环境中设置了以下变量。如果我尝试在awk命令中使用它,它不起作用,但是当我不使用变量时,相同的命令$b工作

$b="新"

当我尝试以下命令时,它不起作用

 echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, '/TABLE/&&/CREATE/&&/`echo ${b}`/{print $NF}'

但是,如果我将$b值替换为 NEW,因为它的工作如下

 echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, '/TABLE/&&/CREATE/&&/NEW/{print $NF}'
你不能

awk中使用这样的bash变量。相反,请使用:

echo "$a" | tr [a-z] [A-Z] | awk -v RS=, -v myvar=$b '/TABLE/&&/CREATE/&& $0~myvar {print $NF}'

请参阅示例:

$ var="hello"
$ awk -v text=$var 'BEGIN{print text}'
hello

另外,对我来说,它适用于tr 'a-z' 'A-Z'而不是tr [a-z] [A-Z]。根据Mark Setchell的建议,您可以使用以下IGNORECASE = 1跳过它:

echo "$a" | awk -v RS=, -v myvar=$b 'BEGIN{IGNORECASE=1} /TABLE/&&/CREATE/&& $0~myvar {print $NF}'

关于你的问题:

if i replace the $b value to NEW as below its working

它之所以有效,是因为变量的值是NEW的,而您最终要做的是在regex中使用它,这正是应该这样做的。

关于你的第二个问题:

can not use unix $variable in awk command

您不能在这样的awk中使用shell变量。您需要通过使用-v选项并分配bash变量来创建awk变量。

awk -v awkvar="$bashvar" '/ /{ ... }'

这使您现有的语法为:

echo "$a" | tr [a-z] [A-Z]  | awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&/var/{print $NF}'

这同样不起作用,因为内部/../变量没有插值,这意味着它们是按字面意思考虑的。因此,您需要执行以下操作:

echo "$a" | tr [a-z] [A-Z]  |awk -v RS=, -v var="$b" '/TABLE/&&/CREATE/&&$0~var{print $NF}'

相关内容

  • 没有找到相关文章

最新更新