打印最长的用户名

打印最长的用户名

我想知道是否有一种方法可以在linux中打印用户名的最长名称。能做到吗?

答案1

要获取最长的用户名(及其长度):

$ getent passwd | awk -F':' '{ print length($1), $1 }' | sort -rn | head -n 1
11 _traceroute

也就是说,获取passwd文件,计算每个用户名的长度(第一个:分隔字符串),按长度排序并选择第一个。

如果有多个相同长度的用户名,则选择按字典顺序排序在最后的用户名。

要获取最长的真实姓名(并查看其真实姓名是什么用户名以及长度):

$ getent passwd | awk -F':' '{ print length($5), $1, $5 }' | sort -rn | head -n 1
32 _rtadvd IPv6 Router Advertisement Daemon

:这与第一个命令执行相同的操作,但它计算文件中第五个分隔字符串的长度passwd。该字段包含用户的真实姓名。输出的是真实姓名、用户名、真实姓名的长度。

在某些系统上,当通过某些工具(如或 )&访问该字段时,用户真实姓名中的 a 将被用户名替换。例如,一个条目可能是fingersendmailpasswd

operator:*:2:5:System &:/operator:/sbin/nologin

计算真实姓名长度时要考虑到这一点:

getent passwd | awk -F':' '{ gsub("&", $1, $5); print length($5), $1, $5 }' | sort -rn | head -n 1

进一步awk选择最长的名称,去掉sortand head

getent passwd |
awk -F':' '
          { gsub("&", $1, $5) ; len = length($5)      }
len > max { line = $0         ; max = len;            }
END       { split(line, a, FS); print max, a[1], a[5] }'

通过这段代码,第一次发现如果有多个相同长度的名称,将选择最长的名称。

答案2

这是相当未经优化的,但由于慢速数据库中通常不会有数以万计的用户,因此可能会这样做:

getent passwd | cut -d: -f1 \
| grep $(getent passwd | cut -d: -f1 | tr '[:print:]' '.' | sort | tail -n1)

让我们稍微取消一下这个东西:getent passwd将列出用户数据库。其中的行的形式为

root:x:0:0:root:/root:/bin/bash

用户名、xUID、GID、GECOS(现在通常是人类可读的用户名)、主目录、shell。我们通常cut -d:1 -f1会删除除第一个:分隔字段(即用户名)之外的所有内容。

总的来说,我们做了两次:一次是为了找到最长的用户名的长度(第 2 行),然后是为了实际找到这个长度的用户名。

为了找到最长用户名的长度,我们只需将tr所有字符替换为.s 即可。然后,我们可以简单地对列表进行排序,并知道.s 的最长字符串是最后一个,因此我们可以使用 获得它tail -n1。 (从技术上讲,这要求始终至少有一个用户,但有 root 用户,所以这是一个相当安全的假设。)

现在我们有一串点,与最长的用户名一样长。幸运的是它是点,因为.它是正则表达式中“任何字符”的通配符,所以我们用来grep将所有用户名与该空格字符串进行匹配,并且只有最长的才会匹配。

(FWIW,在我的 CentOS 机器上,它是systemd-network。)

如果你想要人类可读的名称,你基本上只是想要cut -d: -f5相反。

答案3

我有一个包含用户的名字、姓氏和电子邮件地址的文件。这是我打印最长名字的方法:

awk '{print length($1), $1}' filename | sort -nr | head -1| cut -d\  -f2

请随意根据您的喜好进行调整。请注意,您在后面按了两个空格-d\

要打印最长的用户名,您可以使用

grep -v "^#" /etc/passwd | awk -F: '{print length($1), $1}' | sort -nr | head -1 | cut -d\  -f2

要打印真实的用户名,请使用

grep -v "^#" /etc/passwd | awk -F: '{print length($5), $5}' | sort -nr | head -1 | cut -d\  -f2-

您可以在末尾添加破折号,-f2以确保用户的真实姓名中包含空格。

答案4

以下是除系统用户外最长的 10 个用户名

sed -n '/sbin/!p' /etc/passwd|  awk -F ":" '{print length($1),$1}'| sort -k1 -nr| head

输出

   9 praveen10
9 lost_foud
8 p2_final
7 praveen
6 p1_new
5 user5
5 user4
5 user3
5 user2
5 user1

相关内容