>我在我的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}'