为什么在这种情况下 cut -d ' ' 不适用于空格?

为什么在这种情况下 cut -d ' ' 不适用于空格?

我对这个命令没有任何问题cut

wolf@linux:~$ echo ab cd ef
ab cd ef

wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 1
ab

wolf@linux:~$ echo ab cd ef | cut -d ' ' -f 2
cd

但是,当我使用不同的输入尝试相同的命令时,我没有得到预期的输出。

wolf@linux:~$ ip address show eth0 | grep 'inet '
    inet 10.10.10.10/24 brd 10.10.10.255 scope global dynamic eth0

wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 1

wolf@linux:~$ ip address show eth0 | grep 'inet ' | cut -d ' ' -f 2

第二个例子有什么问题?

awk相同的输入似乎没有问题,奇怪。

wolf@linux:~$ ip address show eth0 | awk '/inet / {print $1}'
inet

wolf@linux:~$ ip address show eth0 | awk '/inet / {print $2}'
10.10.10.10/24

答案1

cut即使存在连续的空格,每个分隔符都有意义。这与awk默认情况下按空格分割的 不同,但将多个空格仅作为一个分隔符,并忽略前导空格。

您可以通过将字段分隔符设置FS为 来使 awk 具有类似的行为[ ]

$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8

必须像正则表达式一样设置,因为单个空格本身FS标记默认的特殊操作。

参见,例如 GNU awk 手册不得不说在字段分隔符上

答案2

grep 输出中的行以 4 个空格开头,如果选择第五个字段,您将获得第一个字符串:

admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet

答案3

我已经创建了一个补丁向 中添加了新的-m命令行选项cut,该选项在字段模式下工作并将多个连续分隔符视为单个分隔符。这基本上以相当有效的方式解决了OP的问题。几天前我也在上游提交了这个补丁,希望它能合并到 coreutils 项目中。

有一些进一步的想法关于向 中添加更多与空白相关的功能cut,并就所有这些提供一些反馈,那就太好了。我愿意实现更多补丁并向cut上游提交它们,这将使该实用程序在各种现实场景中更加通用和更可用。

相关内容