回显具有特定 gid 的用户

回显具有特定 gid 的用户

我应该编写一个 shell 脚本,该脚本将回显主要组等于 id 为命令行参数的组的用户的用户名。

答案1

因为您是按 GID 而不是按组进行查找姓名,而你只对基本的每个用户的 GID,这对于 Awk 来说非常简单。

的格式/etc/passwd在 中描述man 5 passwd。引用手册页:

   There is one entry per line, and each line has the format:

          account:password:UID:GID:GECOS:directory:shell

所以你想打印每行的第一个字段第四字段是传递给脚本的内容。其中“字段”由冒号分隔。

就我个人而言,我不会为此操心脚本;我会使用 shell 函数。看:

所以你需要的是:

  • -F对 Awk 选项的理解
  • 对 awk 语法的基本了解是condition {action}
  • 了解如何在使用 Awk 时引用字段,以及
  • 如果您了解如何将 shell 变量传递给 Awk,将会有所帮助;查看-vawk 的选项。

检查 Awk 的手册页以获得这些要点。


我不会为你做作业——重点是要学会代码,不学复制粘贴。但如果您对此感到困惑,请对此问题发表评论。如果需要,我可以添加更多细节。 (大约一周后我可以更新以包含完整的解决方案。)


旁注:在现实世界中,正如您从其他答案中看到的那样,与查找用户相关的复杂性要大得多。用户的存储方式有很多不同,而考虑到这些复杂性可能会......很复杂。

但您的问题似乎是一个量身定制的作业,可以使用 Awk 轻松完成,同时也是一个在现实世界中有用的实际应用程序。

答案2

这并不总是可能的,因为用户数据库并不总是可枚举的。

passwd数据库(/etc/passwdLDAP、mysql、NIS+等或组合)中,主键是用户名。 (多个用户可以具有相同的 uid,也可能具有不同的 gid)。

您始终可以在用户数据库中查询给定的用户名,但无法始终检索完整的用户列表。

你可以试试。没有标准的命令,但许多系统都有一个getent您可以使用的命令。

getent passwd

将以 csv(冒号分隔)形式返回用户列表。第一个字段是用户名,第四个字段是主 gid。因此,如果您知道 gid,则可以使用 轻松返回用户列表awk

getent -- group "$group"

将查询给定的组数据库$group,并返回一行 csv,其中第三个字段是 gid。cut就足以提取它。

如果用户数据库不可枚举,您可能需要尝试单独查询每个可能的 uid 编号(注意某些系统支持最大 2 31 的uid ),但即使这样也不能保证返回所有可能的用户,因为可能有多个用户每个 uid 都有一个用户,密码数据库查询通常只返回一个用户。

答案3

#!/bin/sh

if [ $# -ne 1 ]
then
  echo "Usage: $0 gid"
  exit 1
fi

getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'

对参数是否存在进行错误检查后,脚本getent passwd使用 awk 查询用户数据库 ( ),以根据组数据库中的主组 ID 检查第四个字段(主组 ID)。如果一行(用户条目)匹配,它将打印第一个字段(用户名)。

相关内容