コマンドラインの引数である ID を持つグループとプライマリ グループが等しいユーザーのユーザー名をエコーするシェル スクリプトを作成する必要があります。
答え1
グループではなくGIDで検索を行っているため名前、そしてあなたが興味を持っているのは主要な各ユーザーの GID は、Awk を使用すると非常に簡単です。
の形式/etc/passwd
は で説明されていますman 5 passwd
。man ページを引用すると、次のようになります。
There is one entry per line, and each line has the format:
account:password:UID:GID:GECOS:directory:shell
つまり、各行の最初のフィールドを印刷したいのですが、第4フィールドはスクリプトに渡されるものです。「フィールド」はコロンで区切られます。
個人的には、スクリプトは使わず、シェル関数を使用します。参照:
必要なのは以下のとおりです:
-F
Awkのオプションの理解- Awkの構文の基本的な理解、つまり
condition {action}
- Awkを使用する際にフィールドを参照する方法を理解し、
- シェル変数を Awk に渡す方法を理解しておくと役立ちます。Awk
-v
のオプションを調べてください。
これらのポイントを理解するには、Awk のマニュアル ページを確認してください。
宿題はやりません。重要なのは、コードコピー&ペーストのやり方を学ぶのではなく、この質問にコメントしてください。必要であれば、もう少し詳細を追加できます。(そして、1週間ほどで、完全な解決策を含むように更新できます。)
補足: 現実の世界では、他の回答からもわかるように、ユーザーの検索にはさらに多くの複雑さが伴います。ユーザーを保存する方法は多種多様であり、それらの複雑さを考慮することは...複雑になる可能性があります。
しかし、あなたの質問は、Awk で簡単に達成できるようにカスタマイズされた課題であると同時に、現実世界で役立つ現実的なアプリケーションでもあるようです。
答え2
ユーザー データベースは常に列挙可能であるとは限らないため、これは必ずしも可能ではありません。
passwd
データベース ( /etc/passwd
、LDAP、mysql、NIS+ など、またはそれらの組み合わせ)では、主キーはユーザー名です。 (複数のユーザーが同じ uid を持つことができますが、gid は異なる場合があります)。
特定のユーザー名についてユーザー データベースをいつでも照会できますが、必ずしもユーザーの完全なリストを取得できるとは限りません。
試してみることができます。そのための標準コマンドはありませんが、多くのシステムにはgetent
使用できるコマンドがあります。
getent passwd
ユーザーのリストを csv (コロンで区切られた) として返します。最初のフィールドはユーザー名で、4 番目のフィールドはプライマリ gid です。したがって、gid がわかっている場合は、 を使用して簡単にユーザーのリストを返すことができますawk
。
getent -- group "$group"
指定されたグループ データベースを照会し$group
、3 番目のフィールドが gid である 1 行の csv を返します。cut
抽出するにはこれで十分です。
ユーザー データベースが列挙可能でない場合は、考えられる各 uid 番号を個別に照会してみることをお勧めします (一部のシステムでは 2 31までの uid がサポートされていることに注意してください)。ただし、その場合でも、uid ごとに複数のユーザーが存在する可能性があり、パスワード データベースの照会では通常 1 人のユーザーのみが返されるため、考えられるすべてのユーザーが返されるとは限りません。
答え3
#!/bin/sh
if [ $# -ne 1 ]
then
echo "Usage: $0 gid"
exit 1
fi
getent passwd | awk -F: -v pgid=$gid '$4 == pgid { print $1 }'
パラメータの存在についてエラー チェックを行った後、スクリプトはgetent passwd
awk を使用してユーザー データベース ( ) を照会し、4 番目のフィールド (プライマリ グループ ID) をグループ データベースのプライマリ グループ ID と照合します。行 (ユーザー エントリ) が一致すると、最初のフィールド (ユーザー名) が出力されます。