尝试在我的系统上获取唯一的 shell 列表。当我运行这个命令时:
cat /etc/passwd | cut -d ':' -f 7 | uniq
我得到:
/bin/bash
/bin/sync
/sbin/shutdown
/sbin/halt
/bin/bash
我不明白为什么uniq
不做我想做的事。我不明白什么?
我尝试获取此输出,制作副本,将其中一行替换/bin/bash
为副本中的另一行,然后diff
ing 文件,但没有输出,所以我猜测不是隐藏字符?
答案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