lid -g groupname 不起作用,因其 -g 选项在多数现代系统中已弃用或行为不一致;推荐用 getent group groupname | cut -d: -f4 提取显式成员。

lid 命令本身并不直接支持“按组名列出所有成员”,它默认是根据用户(而非组)来查询其所属的组。所以想用 lid 快速列出指定用户组的所有成员,需要配合其他命令或换用更合适的工具。
为什么 lid -g groupname 不起作用?
lid 的 -g 选项实际是用于显示某个组的 GID 和该组所属的用户(即反向查成员),但它的行为在不同系统上不一致:部分旧版或非 GNU 系统中 lid -g groupname 可能报错或无输出;现代多数发行版(如 Debian/Ubuntu)已弃用该用法,或仅支持 lid username 形式。
推荐替代方案:用 getent 或 compgen
更可靠、通用的方法是使用系统自带的命令组合:
-
getent group groupname | cut -d: -f4:从/etc/group或 NSS 数据源中提取指定组的成员字段(第4段),以逗号分隔;若为空表示无额外成员(仅含同名用户) getent group groupname | awk -F: '{print $4}' | tr ',' '\n' | grep -v "^$"</strong>:进一步将逗号分隔的成员转为每行一个,过滤空行</li><li><strong><code>compgen -g | grep "^groupname$" && getent group groupname | cut -d: -f4 | tr ',' '\n'</strong>:先确认组存在,再提取成员</li></ul><H3>注意:/etc/group 中的“隐含成员”</H3><p>Linux 组成员关系分两类:<br> - 显式列出在 <code>/etc/group第4字段的用户(如sudo:x:27:alice,bob)
- 用户主组(primary group)不会出现在该字段,但该用户仍属于该组。例如用户charlie主组是dev,但/etc/group中dev行可能不包含charlie—— 这类成员需用getent passwd | awk -F: '$4 == GID {print $1}'配合getent group groupname | cut -d: -f3查 GID 后筛选,一般管理场景中不常需要如果坚持用 lid,可间接实现
只能遍历所有用户,逐个检查是否属于目标组(低效,仅适合小规模环境):
for u in $(getent passwd | cut -d: -f1); do lid "$u" 2>/dev/null | grep -q 'groupname'; [ $? -eq 0 ] && echo "$u"; done- 更稳妥写法:
getent passwd | cut -d: -f1 | xargs -I{} sh -c 'lid {} 2>/dev/null | grep -q "groupname:" && echo {}'
该方式依赖
lid输出格式(通常为user_name(uid): groups: group1(gid1) group2(gid2)...),且性能随用户数增长明显下降,不建议生产环境使用。真正快速、标准的做法是用
getent group groupname解析第4字段,配合文本处理即可。lid 并非为此设计,强行使用反而绕路。

















