如何查找 passwd 文件中最常见的名称

如何查找 passwd 文件中最常见的名称

我的/etc/passwd用户列表的格式如下:

username:password:uid:gid:firstname.lastname, somenumber:/...

目标 :我只想查看名字,然后对它们进行排序,最常见的名字出现在第一个,第二个最常见的出现在第二个等等......

我看到了一些解决方案至于如何执行第二部分,尽管它们与处理文本文件相关,而不是与从地图中读取相关。

对于第一部分,我真的不知道如何处理。我知道有一些解决方案,但不知道如何去做。

答案1

一种方法是:

cut -d: -f5 /etc/passwd | \
    sed 's/\..*//' | \
    sort -i | \
    uniq -ci | \
    sort -rn

答案2

使用 awk 并排序将最常见的名称放在第一位:

awk -F: '{sub(/[.].*/, "", $5); a[$5]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr

对于不区分大小写的版本:

awk -F: '{sub(/[. ,].*/, "", $5); a[tolower($5)]++} END{for (n in a)print a[n],n}' /etc/passwd | sort -nr

对于那些喜欢将命令分散在多行中的人:

awk -F: '
  {
    sub(/[.].*/, "", $5)
    a[$5]++
  }

  END{
    for (n in a)
      print a[n],n
  }
  ' /etc/passwd | sort -nr

怎么运行的

  • -F:

    这使得:字段分隔符。

  • sub(/[.].*/, "", $5)

    这将从字段 5 中删除第一个句点之后的所有内容。

  • a[$5]++

    该名称出现的次数存储在关联数组中a。这会增加计数器的值。对于不区分大小写的版本,它被替换为a[tolower($5)]++.

  • END{for (n in a)print a[n],n}

    这会打印 array 中所有结果的计数和名称a

  • sort -nr

    这会按降序对输出进行数字排序。

相关内容