如何在UNIX上获得用户友好的用户名?

时间:2012-11-05 23:17:19

标签: bash unix

我想获得“友好”名称,而不是用户名,至少如果给定用户存在这样的字符串。我尝试过的事情:

whoami
jamesarosen

id -un
jamesarosen

id -p
uid jamesarosen
groups  staff com.apple.access_screensharing ...

id -P
jamesarosen:********:501:20::0:0:James A. Rosen:/Users/jamesarosen:/bin/bash

最后一个有我正在寻找的信息,但我不想解析它,特别是因为我对格式(特别是:的数量并不十分自信) )将在各个操作系统中保持一致。

5 个答案:

答案 0 :(得分:12)

解析用户全名的GECOS字段

/ etc / passwd和大多数GECOS field的格式在类Unix系统中非常标准化。如果您发现异常,请务必告诉我们。同时,在类Unix系统上获得所需内容的最简单方法是使用 getent cut 来解析GECOS字段。例如:

getent passwd $LOGNAME | cut -d: -f5 | cut -d, -f1

答案 1 :(得分:2)

我知道的唯一方法是解析它:

grep -P "^$(whoami):" /etc/passwd | cut -f5 -d:

您可以非常肯定/ etc / passwd的格式

答案 2 :(得分:2)

您可以使用finger获取该信息:

finger `id -un` | head -1 | cut -d: -f3-

它的优点(或缺点,取决于您的要求),它将检索非本地用户的信息。

如果您只想从/etc/passwd获取信息,您很可能必须以其他方式解析文件,正如其他人已经提到的那样。我个人更喜欢awk来完成这项任务:

awk -F: -vid=`id -u` '{if ($3 == id) print $5}' /etc/passwd

答案 3 :(得分:1)

查看/etc/passwd文件。此文件显示用户信息的存储方式。您的用户信息可能存储也可能不存储(Unix有几个不同的数据库用于存储用户),但格式相同。

基本上,Unix使用用户ID(UID)来存储用户是什么。下一个条目是旧密码条目,然后是UID,主要组ID,GECOS字段,$HOME目录和用户shell。 (MacOS中的id -P命令中显示了三个额外的条目。我不知道它们是什么,但它们使GECOS字段成为第八个字段而不是第五个字段。

在您的系统上使用id -P命令为您提供此条目。有些系统使用getent甚至getpwent作为命令。您需要做的是解析此条目。每个字段用冒号分隔,因此您需要第五个或第八个条目(取决于您必须使用的命令)。

awkcut命令可以很好地执行此操作。 cut可能效率更高,但awk更常见,所以我倾向于使用它。

awk中,标准字段分隔符为空格,但您可以使用-F参数更改此设置。在Awk中,一行中的每个字段都有一个数字,前面有一个美元符号。 $0字段是整行。

使用awk,您得到:

id -P | awk -F: '{print $8}'

这表示采用id -P命令,并使用:作为字段分隔符,并打印出第八个字段。大括号包围所有 AWK程序,并且需要使用单引号来防止shell解释$8

在BASH中,您可以使用$( )来运行命令并返回它的输出,这样您就可以设置环境变量:

$USER_NAME=$(id -P | awk -F: `{print $8}`)
echo $USER_NAME

答案 4 :(得分:1)

至少在macOS上(可能还有其他* BSD-alikes),您可以使用:id -F来获取全名。