在awk中用bash命令replace

为什么这个工作:

这个

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)

Linux 2.6.32-34-generic-pae#77 -Ubuntu SMP Tue Sep 13 21:16:18 UTC 2011 i686 GNU / Linux

如果你的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替换awk ,你会清楚地看到它为什么会失败

 echo hello hi | echo "{ if (\\\$1 == \"$var\" ) print \\\$2; }" { if (\$1 == "hello" ) print \$2; } 

在结果的命令中有额外的'\'(反斜杠)。 这是因为你删除了反引号。 所以解决办法是删除一对

 echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }" hi 

将shell变量传递到AWK程序的正确方法是使用AWK的变量传递功能,而不是试图嵌入shell变量。 通过使用单引号,你将不必做一堆不必要的转义。

 echo "hello hi" | awk -v var="$var" '{ if ($1 == var ) print $2; }' 

此外,你应该使用$()而不是反引号。