Linux 用awk替换bash中的命令

Linux 用awk替换bash中的命令,linux,bash,Linux,Bash,为什么这样做有效: 这个 给予 但事实并非如此 这个 给予 我正在使用 GNUBash,版本4.1.5(1)-发行版(i486 pc linux GNU) 在 Linux 2.6.32-34-generic-pae#77 Ubuntu SMP周二9月13日21:16:18 UTC 2011 i686 GNU/Linux将shell变量传递到AWK程序中的正确方法是使用AWK的变量传递功能,而不是尝试嵌入shell变量。通过使用单引号,您不必进行大量不必要的转义 echo "hello hi" |

为什么这样做有效:

这个

给予

但事实并非如此

这个

给予

我正在使用

GNUBash,版本4.1.5(1)-发行版(i486 pc linux GNU)


Linux 2.6.32-34-generic-pae#77 Ubuntu SMP周二9月13日21:16:18 UTC 2011 i686 GNU/Linux将shell变量传递到AWK程序中的正确方法是使用AWK的变量传递功能,而不是尝试嵌入shell变量。通过使用单引号,您不必进行大量不必要的转义

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

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

如果您的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
结果命令中有额外的“\”(反斜杠)。这是因为您删除了反引号。 因此,解决方案是移除一对

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

您可以尝试这两种代码。你会看到第二个错误。这不是工作的方式。一个结构合理的问题包括对你的目标和不符合你期望的结果的解释。人们可能会尝试你的代码,但完全解释你的问题取决于你。好的,我编辑了我的问题并添加了我得到的输出。我得到一个不同的错误:
反斜杠不是第行的最后一个字符
。请在命令之前和之后尝试
set-x
,查看变量替换和反斜杠求值等工作方式的跟踪。@DennisWilliamson Ok将尝试这样做。谢谢,谢谢,丹尼斯。你是对的,我知道awk-v。但是我想知道为什么我的第二次尝试实际上失败了。@abc:要正确地使用反勾号来进行复杂的引用和转义是一个棘手的问题。首先正确地做这件事可以避免所有的不愉快。当我运行你的第一个例子时,我没有得到一个错误,但是我也没有得到任何响应变量的输出。Dennis,我添加了我正在使用的bash版本和Linux版本。这对我很管用。您使用的是什么版本?@abc:对不起,命令替换不起作用。在我的测试中,我将
var
设置为错误的值。
awk: cmd. line:1: Unexpected token
echo "hello hi" | awk -v var="$var" '{ if ($1 == var ) print $2; }'
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
echo hello hi | echo "{ if (\\\$1 == \"$var\" ) print \\\$2; }"
{ if (\$1 == "hello" ) print \$2; }
echo hello hi | awk "{ if (\$1 == \"$var\" ) print \$2; }"
hi