중복된 사용자 이름을 찾으려면 다음 코드를 사용합니다. 그러나 오류가 발생합니다.
#!/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
답변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에 공백이 포함되어 있으면 이상하게 동작할 수 있습니다.