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

Wol*_*olf 3 grep cut

我对这个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
Run Code Online (Sandbox Code Playgroud)

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

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
Run Code Online (Sandbox Code Playgroud)

第二个例子有什么问题?

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
Run Code Online (Sandbox Code Playgroud)

ilk*_*chu 11

cut即使有连续的空格,也将每个分隔符都视为有意义的。这与 不同awk,它默认在空格上拆分,但仅将多个空格作为一个分隔符,并忽略前导空格。

你可以得到AWK由字段分隔设置行为相似FS[ ]

$ ip add show lo | awk -F'[ ]' '$5 == "inet" {print $6}'
127.0.0.1/8
Run Code Online (Sandbox Code Playgroud)

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

参见,例如 GNU awk 手册对字段分隔符有说明


小智 5

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

admin:~ # ip address show eth0 | grep 'inet ' | cut -d " " -f 5
inet
Run Code Online (Sandbox Code Playgroud)

  • 这不是问题,这是设计的不同行为。`cut` 使用单个字符作为分隔符 - 在您的示例中*正好*一个空格。对于`$x` 访问器,`awk` 对输入执行类似shell 的扩展,让您可以访问由*至少* 一个空格字符分隔的“单词”。 (5认同)