グループ番号(GID)をパラメータとして受け入れるスクリプトの作成

グループ番号(GID)をパラメータとして受け入れるスクリプトの作成

グループ番号(GID)をパラメータとして受け入れるスクリプトを作成しようとしています。パラメーターは任意の数字にすることができます。このスクリプトの作業は、ファイルに基づいて特定のグループに属するユーザーの数を計算して表示することです/etc/passwd。このスクリプトでは awk コマンドは使用できません。

今は書いています。

#!/bin/bash 
cat /etc/passwd 
test(){
local dir gid name pass shell uid user
while IFS=':' read user pass uid gid name dir shell ;do
}

次は何が起こるのだろうか?

ベストアンサー1

すべてのグループがgroupデータベースにあります。グループのメンバー数を計算するには、メンバーを抽出し、メンバー間のコンマを計算します。グループメンバー数は、1にこの数字を加えた値です。

#!/bin/sh

n=$( getent group "$1" | cut -d : -f 4 | grep -o , | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

このアプローチの欠点は、グループが無効な場合でも常に少なくとも1つのメンバーが出力として得られることです。ただし、有効なグループを最初にテストできます。

#!/bin/sh

if ! getent group "$1" >/dev/null; then
    printf 'No such group: %s\n' "$1" >&2
    exit 1
fi

n=$( getent group "$1" | cut -d : -f 4 | grep -o , | wc -l )

printf 'There are %d members of group %s\n' "$(( n + 1 ))" "$1"

スクリプトは、最初のコマンドライン引数として数値GIDとグループ名を受け入れます。

それでawkあなたはします

n=$( getent group "$1" | awk -F : '{ print split($4,dummy,",") }' )

$nその後、最後に1を追加しないでください。

getent group "$1" | awk -F : '
    { 
        printf("There are %d members of group %s (%d)\n",
            split($4,dummy,","), $1, $3)
    }'

printf(シェル)や変数はありませんn

これはデータベース内のレコードのグループメンバーシップを計算しますgroup。計算のみ基本的なグループメンバーシップの場合は、次のものを使用します。

n=$( getent passwd | cut -d : -f 4 | grep -cxF "$1" )

$1しかし、もう一度申し上げますが、これが実際に有効なグループIDであることを最初に確認したい場合があります。

来て計算してみてください両方idプライマリグループとセカンダリグループのメンバーシップでは、すべてのユーザーを繰り返して各ユーザーに使用することをお勧めします。

getent passwd | cut -d : -f 1 |
while read user; do
    if id -G "$user" | tr ' ' '\n' | grep -q -xF "$1"; then
        n=$(( n + 1 ))
    fi
done

これはすべてのユーザー名を抽出し、id -G各ユーザー名を呼び出し、結果のGIDリストを改行区切りリストに変換します。次に、grep与えられたGIDがリストの一部であることを確認し、nその場合は1を追加します。

または、より高速ですが、より醜いです。

n=$( getent passwd | cut -d : -f 1 |
     while read user; do
         id -G "$user"
     done | tr ' ' '\n' | grep -c -xF "$1" )

でも、

n=$( getent passwd    | cut -d : -f 1 |
     xargs -n 1 id -G | tr ' ' '\n'   |
     grep -c -xF "$1" )

これが良いアプローチである可能性があるのは、データベースにデフォルトグループがgroup含まれていないユーザーがいる可能性があるためです。

おすすめ記事