グループに所属するユーザーを調べたいときはgetent group、ユーザーが所属するグループを調べたいときはgetent initgroupsを使う。

$ getent group devs
devs:x:2000:alice,bob
$ getent initgroups alice
alice                 2000 2001

devsグループ(GID 2000)にaliceとbobが所属し、aliceはdevsとops(GID 2001)に所属している環境での実行例である。実行例はUbuntu 24.04(glibc 2.39)のもの。

getent groupは、/etc/groupを直接読むgrepと違い、/etc/nsswitch.confに従ってグループを探す。LDAPやSSSDなどのディレクトリサービス上のグループも表示できる。

グループのメンバーを調べる

getent group グループ名は、/etc/groupと同じ形式の1行を表示する。コロン区切りの4項目である。

項目例内容
1devsグループ名
2xパスワード(通常はx)
32000GID
4alice,bobメンバー(カンマ区切り)

グループ名の代わりにGIDも渡せる。複数の引数も並べられる。

$ getent group 2001
ops:x:2001:alice
$ getent group devs ops
devs:x:2000:alice,bob
ops:x:2001:alice

存在しないグループは何も表示されず、終了コードが2になる。

$ getent group nogroup_x
$ echo $?
2

メンバーを1行に1人ずつ表示したいときは、cutとtrを使う。

$ getent group devs | cut -d: -f4 | tr ',' '\n'
alice
bob

プライマリグループのメンバーは4項目目に出ない

ユーザーのプライマリグループは/etc/passwdのGIDで決まる。プライマリグループとして所属しているだけのユーザーは、getent groupのメンバー欄に表示されない。

useradd aliceで作られたaliceのプライマリグループはalice(GID 1001)だが、メンバー欄は空である。

$ getent group alice
alice:x:1001:

プライマリグループに所属するユーザーを調べるには、getent passwdのGIDで絞り込む。

$ getent passwd | awk -F: '$4==1001{print $1}'
alice

参考: 【getent】ユーザーの情報(UID・ホームディレクトリ・シェル)を調べる (passwd)

ユーザーが所属するグループを調べる

getent initgroups ユーザー名は、ユーザーが所属するグループのGIDを1行で表示する。

$ getent initgroups alice
alice                 2000 2001
$ getent initgroups bob
bob                   2000

1列目がユーザー名、2列目以降がGIDである。GIDからグループ名に変換するには、getent groupに渡す。

$ for g in $(getent initgroups alice | cut -d' ' -f2-); do getent group $g | cut -d: -f1; done
devs
ops

プライマリグループは含まれない

getent initgroupsの結果には、ユーザーのプライマリグループが含まれない。aliceのプライマリグループ(GID 1001)は、上の出力に無い。

idとgroupsは、プライマリグループも含めて表示する。

$ id alice
uid=1001(alice) gid=1001(alice) groups=1001(alice),2000(devs),2001(ops)
$ groups alice
alice : alice devs ops

プライマリグループも含めたグループの一覧が欲しいときは、idやgroupsを使う。getent initgroupsは、追加で所属しているグループだけを調べたいときに使う。

存在しないユーザーでも終了コードは0になる

追加のグループを持たないユーザーや、存在しないユーザーを指定すると、ユーザー名だけが表示される。存在しないユーザーでも終了コードは0である。

$ getent initgroups nosuchuser
nosuchuser
$ echo $?
0

ユーザーの存在確認にgetent initgroupsは使えない。getent passwdを使う。

参考: 【getent】ユーザーやグループが存在するかシェルスクリプトで判定する (終了コード)

すべてのグループを一覧する

引数を省略すると、すべてのグループが表示される。initgroupsは全件の一覧に対応していない。

参考: 【getent】データベースのエントリを全件列挙する (キー省略)