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