You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

UNIX系统中如何从/etc/passwd和/etc/group生成含用户名及组名的用户报告?

生成UNIX用户报告:整合用户名(UID)与对应组名

没问题,我来帮你搞定这个需求!要从/etc/passwd和/etc/group里提取数据,把每个用户的GID匹配到对应的组名,这里有两种实用的shell方案供你选择:

方法1:用join命令组合排序后的文件

join命令专门用来按共同字段合并两个文件,不过需要先把两个文件按GID字段排序:

join -t: -1 4 -2 3 -o 1.1,1.3,2.1 <(sort -t: -k4 /etc/passwd) <(sort -t: -k3 /etc/group) | column -t -s:

命令拆解:

  • <(sort -t: -k4 /etc/passwd):按GID(第4个冒号分隔字段)排序/etc/passwd
  • <(sort -t: -k3 /etc/group):按GID(第3个冒号分隔字段)排序/etc/group
  • join -t::指定字段分隔符为冒号
  • -1 4 -2 3:用第一个文件的第4字段和第二个文件的第3字段(都是GID)作为关联键
  • -o 1.1,1.3,2.1:指定输出内容:用户名(passwd第1字段)、UID(passwd第3字段)、组名(group第1字段)
  • column -t -s::把输出格式成整齐的表格,可读性拉满

如果要显示所有用户(包括GID在/etc/group里找不到匹配的用户),可以加-a1参数,并把空组名替换成N/A:

join -t: -1 4 -2 3 -a1 -o 1.1,1.3,2.1 <(sort -t: -k4 /etc/passwd) <(sort -t: -k3 /etc/group) | sed 's/::/:N\/A:/' | column -t -s:

方法2:用awk灵活处理(推荐)

awk可以直接把/etc/group的GID-组名映射存到数组里,再遍历/etc/passwd输出结果,逻辑更直观:

awk -F: 'NR==FNR {gid_map[$3]=$1; next} {printf "%-15s (%d)  %s\n", $1, $3, gid_map[$4] ? gid_map[$4] : "N/A"}' /etc/group /etc/passwd

命令拆解:

  • NR==FNR:处理第一个文件(/etc/group)时,把GID作为键,组名作为值存入gid_map数组
  • next:跳过后续逻辑,继续读下一行
  • 处理/etc/passwd时,格式化输出用户名、UID(括号包裹)、对应的组名;如果GID没有匹配的组名,就显示N/A
  • 用printf的格式控制可以让输出更整齐,不用额外调用column

两种方法都能生成符合要求的报告,你可以根据自己的习惯选择~

内容的提问来源于stack exchange,提问作者user266746

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.19 09:46:47