7

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

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

最后一个有我正在寻找的信息,但我不想把它解析出来,特别是因为我不太相信格式(特别是:s 的数量)将在操作系统之间保持一致。

4

5 回答 5

12

解析 GECOS 字段以获取用户的全名

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

getent passwd $LOGNAME | cut -d: -f5 | cut -d, -f1
于 2012-11-05T23:24:24.443 回答
2

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

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

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

于 2012-11-05T23:23:35.327 回答
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
于 2012-11-05T23:47:02.477 回答
1

看看/etc/passwd文件。该文件向您展示了用户信息的存储方式。您的用户信息可能会或可能不会存储在此处(Unix 使用几种不同的数据库来存储用户),但格式是相同的。

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

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

awkandcut命令可以很好地做到这一点。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
于 2012-11-06T14:20:13.710 回答
1

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

于 2018-03-13T00:53:48.227 回答