2

为什么会这样:

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

4

2 回答 2

10

将 shell 变量传递到 AWK 程序的正确方法是使用 AWK 的变量传递功能,而不是尝试嵌入 shell 变量。并且通过使用单引号,您不必进行大量不必要的转义。

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

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

于 2012-05-08T04:30:45.263 回答
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; }

结果命令中有额外的“\”(反斜杠)。这是因为您删除了反引号。所以解决方案是删除一对\'s

echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }"
hi
于 2012-05-08T04:47:23.267 回答