我应该编写一个 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,将会有所帮助;查看
-v
awk 的选项。
检查 Awk 的手册页以获得这些要点。
我不会为你做作业——重点是要学会代码,不学复制粘贴。但如果您对此感到困惑,请对此问题发表评论。如果需要,我可以添加更多细节。 (大约一周后我可以更新以包含完整的解决方案。)
旁注:在现实世界中,正如您从其他答案中看到的那样,与查找用户相关的复杂性要大得多。用户的存储方式有很多不同,而考虑到这些复杂性可能会......很复杂。
但您的问题似乎是一个量身定制的作业,可以使用 Awk 轻松完成,同时也是一个在现实世界中有用的实际应用程序。
答案2
这并不总是可能的,因为用户数据库并不总是可枚举的。
在passwd
数据库(/etc/passwd
LDAP、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)。如果一行(用户条目)匹配,它将打印第一个字段(用户名)。