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/groupjoin -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
相关产品推荐
相关产品推荐

