使用awk在bash中命令替换

时间:2012-05-08 04:12:14

标签: linux bash

为什么这样做:

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

2 个答案:

答案 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