为什么这样做:
此
var=hello
myvar=`echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }"`
echo $myvar
给出
hi
但这不是吗?
此
var=hello
echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
给出
awk: cmd. line:1: Unexpected token
我正在使用
GNU bash,版本4.1.5(1)-release(i486-pc-linux-gnu)
on
Linux 2.6.32-34-generic-pae#77-Ubuntu SMP Tue Sep 13 21:16:18 UTC 2011 i686 GNU / Linux
答案 0 :(得分:10)
将shell变量传递给AWK程序的正确方法是使用AWK的变量传递功能,而不是尝试嵌入shell变量。通过使用单引号,您不必进行大量不必要的转义。
echo "hello hi" | awk -v var="$var" '{ if ($1 == var ) print $2; }'
此外,您应该使用$()
而不是反对。
答案 1 :(得分:5)
如果你的awk和我的一样,它会告诉你失败的地方:
var=hello
echo hello hi | awk "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
awk: syntax error at source line 1
context is
{ if >>> (\ <<< $1 == "hello" ) print \$2; }
awk: illegal statement at source line 1
此外,如果您将awk
替换为echo
,您会清楚地看到它失败的原因
echo hello hi | echo "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
{ if (\$1 == "hello" ) print \$2; }
在结果命令中有额外的'\'(反斜杠)。这是因为你删除了反引号。 因此解决方案是删除一对\
echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }"
hi