为什么 cut 在这里不能像预期的那样与分隔符一起工作?

为什么 cut 在这里不能像预期的那样与分隔符一起工作?

我有这个文件作为输入:

root      1243  0.0  0.0  65508  6036 ?        Ss   Apr30   0:05 /usr/sbin/sshd -D
root      7385  0.0  0.1 152932 10644 ?        Ss   16:22   0:00 sshd: per1 [priv]
per2  7425  0.0  0.0 152932  6216 ?        S    16:22   0:00 sshd: per2@pts/7
root      8256  0.0  0.1 152876 10240 ?        Ss   16:32   0:00 sshd: per3 [priv]
per3  8298  0.0  0.0 152876  5308 ?        S    16:32   0:00 sshd: per3@pts/9

我希望能够选择第一列唯一名称:

cut -f 1 file.txt | sort | uniq但这是行不通的。我要做cut -f 1 -d " " file.txt ...

我为什么要添加这个-d 1?据我了解,当列之间的空间是不是选项卡,我们必须写它是什么。在这种情况下是这样" ",所以这就是我们写它的原因。它是否正确?

那么这里如何选择第二列呢?我只是将其更改cut -f 1cut -f 2但这并没有做到。我的输出是一堆空行?为什么?为什么它有效cut -f 1但 2 不起作用?

答案1

如果你想要第一个空间- 分隔字段cut,那么你必须告诉它使用空格而不是默认的制表符:

https://linux.die.net/man/1/cut

-d, --delimiter=DELIM

使用 DELIM 而不是 TAB 作为字段分隔符

一旦您告诉cut使用空格作为分隔符,它就会使用空格,因此“字段 2”成为第一个空格后面的第一个字节(直到它看到另一个分隔符);就你而言,那是一个空格。

使用此数据作为说明性示例:

root 1space 2space 3space

...前面有一个空格1space,前面有两个空格2space,前面有三个空格3space

$ seq 1 7 | while read index; do echo "$index" - "$(cut -d' ' -f $index < input)"; done
1 - root
2 - 1space
3 -
4 - 2space
5 -
6 -
7 - 3space

由于输入中的字段之间有不同数量的空格分隔,我建议:

  • 如果您可以“更改”数据,请使用sed将多个空格减少为一个,如 Steeldriver 所示:sed 's/ */ /g' < input | cut -d' ' -f2
  • 否则,请考虑使用类似的工具awk,将字段拆分为多个后续字段分隔符:awk '{print $2}' < input

相关内容