CentOS에서 중복 사용자 찾기

CentOS에서 중복 사용자 찾기

중복된 사용자 이름을 찾으려면 다음 코드를 사용합니다. 그러나 오류가 발생합니다.

#!/bin/bash
cat /etc/passwd | cut -f1 -d":" | /bin/sort -n | /usr/bin/uniq -c |\
    while read x; do [ -z "${x}" ] && break set - $x
        if [ $1 -gt 1 ]; then
            uids=`/bin/gawk -F: '($1 == n) { print $3 }' n=$2 \
            /etc/passwd | xargs`
            echo "Duplicate User Name ($2): ${uids}"
        fi
    done

"완료" 표시 근처에서 구문 오류와 숫자 오류가 발생합니다. 이 오류를 어떻게 해결할 수 있나요?

답변1

$ cut -d: -f1 /etc/passwd | sort | uniq -d

:그러면 구분된 파일(사용자 이름)의 첫 번째 필드가 추출되고 /etc/passwd결과가 정렬되며 중복 항목이 보고됩니다.

UID와 나머지 중복 passwd항목을 모두 가져옵니다.

cut -d: -f1 /etc/passwd | sort | uniq -d |
while read -r username; do
  grep "^$username:" /etc/passwd
done

중복된 사용자 이름과 해당 UID만 가져옵니다.

cut -d: -f1 /etc/passwd | sort | uniq -d |
while read -r username; do
  awk -F: -vu="$username" '$1 == u { print $1, $3 }' /etc/passwd
done

스크립트에 대한 간략한 메모입니다. 문법것 같다대부분은 작동하지만 ;이후에 필요하며 break둘 다 뒤에 공백이 있습니다 \(아마도 잘라내기 및 붙여넣기 오류였을 것입니다(현재 편집으로 제거됨)). 또한 정당한 이유 없이 표준 유틸리티에 대한 전체 경로를 제공하는 것을 피하고 awk프로그램에 GNU가 필요하지 않으므로 괜찮 awk습니다 awk.

답변2

  1. do일반적으로 데이터를 얻은 후 또는 확인한 후 사이에 하나가 있어야 합니다 .whiledoneread
  2. set - $x한 줄에 단독으로 입력하거나 최소한 break세미콜론( ;)으로 구분해야 합니다. (여기에 두는 것이 좋을 것 같습니다 do.)

제안:

  1. 그렇게 하기 보다는 변화를 set - $x고려해보세요 .read xread count name
  2. 명확성을 위해 다음 `…`으로 변경하고 싶을 수도 있습니다 .$(…)이것, 이것, 그리고이것.

답변3

awk(한 줄)를 사용하여 다음과 같은 작업을 수행합니다.

awk -F: '{if ($1 in users) print "Duplicate Username: "$1 ; else users[$1]}' /etc/passwd

사용자 배열 변수에서 사용자 이름을 찾고, 중복된 경우 메시지를 인쇄하고, 그렇지 않으면 사용자를 배열에 추가합니다.

답변4

에서 영감을 받다에이바르의 대답, 이 awk명령은 OP 스크립트의 의도된 기능을 복제합니다.

awk -F: '{ uids[$1] = uids[$1] " " $3; }
         END { for (u in uids) { if (uids[u] ~ /. /)
                         print "Duplicate User Name (" u "):" uids[u]; } }'

ebal의 답변에서와 같이 각 고유 사용자 이름에 대해 하나의 항목이 포함된 연관 배열을 생성합니다. 각 행에 대한 공백과 사용자의 UID를 연결하여 각 항목의 값을 설정합니다. 그런 다음 전체 파일을 읽은 후 고유한 사용자 이름을 반복하여 해당 사용자 이름이 여러 번 나타나는지 확인하고(UID 목록에 첫 번째 문자를 제외한 공백이 있다는 사실로 식별됨) 필요한 정보를 보고합니다.

파일의 UID에 공백이 포함되어 있으면 이상하게 동작할 수 있습니다.

관련 정보