我对这个命令没有任何问题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