我有这个文件作为输入:
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 1
为cut -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