基本グループがコマンドライン引数であるIDを持つグループと同じユーザーのユーザー名をエコーするシェルスクリプトを作成する必要があります。
答え1
グループではなくGIDで探しているから名前、そしてあなたの言葉が正しい基本的な各ユーザーのGIDは、Awkを使用すると非常に簡単です。
フォーマットは/etc/passwd
で説明されていますman 5 passwd
。マニュアルページを引用すると、次のようになります。
There is one entry per line, and each line has the format:
account:password:UID:GID:GECOS:directory:shell
したがって、各行の最初のフィールドを印刷したいと思います。第四フィールドはスクリプトに渡されます。ここで、「フィールド」はコロンで区切られます。
個人的には、このためにスクリプトを使用せずにシェル関数を使用します。望むより:
したがって、必要なものは次のとおりです。
-F
Awkオプションについて- awk構文の基本的な理解は次のとおりです。
condition {action}
- Awkを使用するときにフィールドを参照する方法を学びます。
- Awkにシェル変数を渡す方法を知っていれば役に立ちます。
-v
awkのオプションを見てください。
これらについては、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のcsv行を返します。cut
抽出すれば十分です。
ユーザーデータベースが列挙可能でない場合は、可能な各uid番号を個別に照会しようとすることができます(一部のシステムは最大2 31までuidをサポートしています)。ただし、この場合でも複数のユーザーがいる可能性があるため、可能なすべてのユーザーを返すことを保証することはできません。 UIDごとのユーザーは1人で、パスワードデータベースクエリは通常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を使用してユーザーデータベース()を照会し、グループデータベースのデフォルトグループIDの4番目のフィールド(デフォルトグループID)を確認します。行(ユーザーエントリ)が一致すると、最初のフィールド(ユーザー名)が印刷されます。