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