我想知道是否有一种方法可以在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 将被用户名替换。例如,一个条目可能是finger
sendmail
passwd
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
选择最长的名称,去掉sort
and 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
用户名、x
UID、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