不能在awk命令中使用unix $变量

时间:2014-02-28 16:04:39

标签: linux bash shell unix awk

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

$ B = “NEW”

当我尝试按照命令时,它无法正常工作

 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}'

2 个答案:

答案 0 :(得分:5)

您不能在bash内使用awk var。相反,使用:

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]。根据{{​​3}}建议,您可以使用IGNORECASE = 1

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

答案 1 :(得分:1)

关于你的问题:

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

它的作用是因为你的变量的值是NEW而你最终要做的就是在regex中使用它,这正是它应该完成的方式。

关于你的第二个问题:

can not use unix $variable in awk command

您不能在shell中使用awk个变量。您需要使用awk选项创建-v变量并分配bash变量。

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}'