Sony Santos Asked: 2020-06-20 01:18:51 +0800 CST2020-06-20 01:18:51 +0800 CST 2020-06-20 01:18:51 +0800 CST AWK 正在打印所有列 772 我想隔离第二列。 如果我做: echo "1 2 3" | awk "{ print $2 }" 结果是: 1 2 3 预期结果是: 2 我试过-F' '选项,但结果是一样的。 我究竟做错了什么? awk 3 个回答 Voted Best Answer Setanta 2020-06-20T01:25:46+08:002020-06-20T01:25:46+08:00 你需要单引号: echo "1 2 3" | awk '{ print $2 }' 将返回2 DavidPostill 2020-06-20T01:35:16+08:002020-06-20T01:35:16+08:00 我究竟做错了什么? 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 user596332 2020-07-27T05:00:48+08:002020-07-27T05:00:48+08:00 其他两个答案中已经给出了正确的方法: echo "1 2 3" | awk '{print $2}' 但是,缺少“为什么”,所以我添加了它。 echo "1 2 3" | awk "{print $2}" 失败,因为shell在$2. 即,它检索该变量的值,就像a=6;echo "$a"在命令行中打印 6 一样。从POSIX shell 手册中, 用双引号 ( "" ) 括起来的字符应保留双引号内所有字符的字面值,但反引号 (`)、美元符号 ($)和反斜杠 (\) 字符除外。 除非您的 shell 是从参数开始的(极不可能的情况),否则$2扩展为空字符串并且 awk 永远不会看到$2, just {print },从而打印整个1 2 3字符串。 请记住,说 awk 程序必须用单引号括起来是错误的。awk 只需要获取它的字节,而不关心 shell 采取什么步骤来传递它们。所以,这些也是正确的: echo "X Y Z" | awk "{print \$2}" echo "X Y Z" | awk \{print\ \$2\} 哎呀!我说是对的,不干净。 结论:尽可能将 awk 程序用单引号括起来。
你需要单引号:
echo "1 2 3" | awk '{ print $2 }'
将返回
2
我究竟做错了什么?
正确的命令是
或者
例子:
其他两个答案中已经给出了正确的方法:
但是,缺少“为什么”,所以我添加了它。
失败,因为shell在
$2
. 即,它检索该变量的值,就像a=6;echo "$a"
在命令行中打印 6 一样。从POSIX shell 手册中,除非您的 shell 是从参数开始的(极不可能的情况),否则
$2
扩展为空字符串并且 awk 永远不会看到$2
, just{print }
,从而打印整个1 2 3
字符串。请记住,说 awk 程序必须用单引号括起来是错误的。awk 只需要获取它的字节,而不关心 shell 采取什么步骤来传递它们。所以,这些也是正确的:
哎呀!我说是对的,不干净。
结论:尽可能将 awk 程序用单引号括起来。