如何用awk从/etc/group提取组名、组ID及组内用户数并格式化输出?
问题根源
原有脚本的错误点非常明确:
- 提前统计的组用户数是逐行输出的多行结果,存入shell变量后会被压成空格分隔的单行字符串,传入awk后无法和逐行读取的
/etc/group条目一一对应,必然出现输出错位。 - 完全不需要拆分cut、awk两次调用传值,单条awk命令就可以完成全流程处理,从根源上避免行匹配错误。
修正方案
直接使用单awk脚本处理即可,代码如下:
#!/bin/bash awk -F':' ' { # 统计当前组用户数量 if ($4 == "") { cnt = 0 } else { split($4, user_arr, ",") cnt = length(user_arr) } # 处理名词单复数 suffix = cnt == 1 ? "account" : "accounts" # 格式化对齐输出,匹配预期格式 printf "Group : %-7s ID:%3d : %d %s\n\n", $1, $3, cnt, suffix } ' /etc/group
逻辑说明
- 逐行读取
/etc/group时直接处理当前行的组名字段$1、组ID字段$3、用户列表字段$4,天然一一对应,不会出现错位。 - 对空的用户列表直接判定为0个用户,非空列表按逗号分割为数组,数组长度就是组内用户总数。
- 用
printf做固定宽度格式化,实现组名、ID列的对齐效果,同时自动匹配account的单复数形式,和给出的预期输出格式完全一致。
内容的提问来源于stack exchange,提问作者Franco Reyes
相关产品推荐
相关产品推荐

