AWK 正在打印所有列

AWK 正在打印所有列

我想隔离第二列。

如果我做:

echo "1  2 3" | awk "{ print $2 }"

结果是:

1  2 3

预期结果是:

2

我已尝试过-F' '其他选项,但结果是一样的。

我究竟做错了什么?

答案1

您需要单引号:

echo "1 2 3" | awk '{ print $2 }'

将返回2

答案2

我究竟做错了什么?

echo "1  2 3" | awk "{ print $2 }"

正确的命令是

echo "1  2 3" | awk '{ print $2 }'

或者

echo "1  2 3" | awk "{ print \$2 }"

例子:

$ echo "1  2 3" | awk '{ print $2 }'
2
$ echo "1  2 3" | awk "{ print \$2 }"
2

答案3

另外两个答案已经给出了正确的方法:

echo "1  2 3" | awk '{print $2}'

但缺少了“为什么”,所以我添加了它。

echo "1  2 3" | awk "{print $2}"

由于炮弹执行而失败参数扩展$2。即,它检索该变量的值,就像a=6;echo "$a"在命令行中打印 6 一样。从POSIX shell 手册

将字符括在双引号(“”)中将保留双引号内所有字符的字面值,除了字符反引号(`),美元符号 ($)和反斜杠 (\)。

除非你的 shell 是用参数启动的(极不可能发生的情况),否则$2会扩展为空字符串,而 awk 永远不会看到$2,而只会看到{print },从而打印整个1 2 3字符串。

请记住,说 awk 程序必须用单引号括起来。Awk 只需要获取其字节,而不必关心 shell 采取什么步骤来传递它们。因此,这些也是正确的:

echo "X  Y Z" | awk "{print \$2}"
echo "X  Y Z" | awk \{print\ \$2\}

哎呀!我说的是正确,不是干净。

结论:尽可能将 awk 程序括在单引号中。

相关内容