在awk中使用双引号

mic*_*ael 2 linux shell

此命令将打印a.

echo "line1 a b c" | awk '{ print $2 }'
Run Code Online (Sandbox Code Playgroud)

如果我将单引号更改为双引号,就像这样,它将打印整行.

echo "line1 a b c" | awk "{ print $2 }"
Run Code Online (Sandbox Code Playgroud)

为什么?我知道我应该使用单引号,但如果我使用双引号,为什么打印整行?

the*_*ler 6

如果awk命令是单引号,$2则shell不会解释它,而是作为文字字符串传递$2awk.awk然后print输入字符串中的第二个空格分隔标记,在这种情况下是a.

echo "line1 a b c" | awk '{ print $2 }' # prints the second space-delimited token
> a
Run Code Online (Sandbox Code Playgroud)

如果awk命令是双引号,$2则由shell解释.因为$2为空(在本例中),所以替换空字符串.awk看到一个看起来像的命令awk "{ print }",这是一个打印所有内容的指令.

echo "line1 a b c" | awk '{ print }' # prints all input
> line1 a b c
Run Code Online (Sandbox Code Playgroud)

也可以使用双qotes,并转义$,这将导致$shell不被解释,而是将$2字符串传递给awk.

echo "line1 a b c" | awk "{ print \$2 }" # prints the second space-delimited token
> a
Run Code Online (Sandbox Code Playgroud)