我想隔离第二列。
如果我做:
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 程序括在单引号中。