그룹 번호(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기본 그룹이 데이터베이스에 포함되지 않은 사용자가 있을 수 있기 때문입니다.

관련 정보