为什么我无法获得唯一的 shell 列表?

为什么我无法获得唯一的 shell 列表?

尝试在我的系统上获取唯一的 shell 列表。当我运行这个命令时:

cat /etc/passwd | cut -d ':' -f 7 | uniq

我得到:

/bin/bash  
/bin/sync  
/sbin/shutdown  
/sbin/halt  
/bin/bash

我不明白为什么uniq不做我想做的事。我不明白什么?

我尝试获取此输出,制作副本,将其中一行替换/bin/bash为副本中的另一行,然后diffing 文件,但没有输出,所以我猜测不是隐藏字符?

答案1

这是因为uniq男人的工作方式:

注意:“uniq”不检测重复行除非它们相邻。您可能想首先对输入进行排序,或者使用不带“uniq”的“sort -u”。

因此,更好地使用,不需要cat

$ cut -d ':' -f 7 /etc/passwd | sort -u
/bin/bash
/bin/false
/bin/sync
/usr/sbin/nologin

或者,一个命令

 awk -F: '{ print $7 | "sort -u" }' /etc/passwd

@小次郎的建议:

awk -F: '!s[$7]++{print $7}' /etc/passwd

答案2

您必须传递排序的输出才能uniq使其工作。

$ cat /etc/passwd | cut -d ':' -f 7 | sort | uniq
/bin/bash
/bin/sync
/sbin/halt
/sbin/shutdown

相关内容