파일에서 중복 로그인 확인

파일에서 중복 로그인 확인

내 코드에 문제가 있습니다. Bourne shell명령을 통해 서버에서 사용자 목록을 가져온 who다음 파일에 저장 하는 스크립트를 작성 중입니다 . 그런 다음 이름을 확인하고 read line스크립트가 중복된 이름을 찾으면 그렇지 않으면 사용자 이름과 함께 경고 메시지를 인쇄합니다. 중복된 항목이 없습니다.가 인쇄됩니다. 스크립트가 중복된 이름을 찾으면 모든 것이 잘 작동하지만 스크립트가 중복된 이름을 찾지 못하면 아무것도 인쇄하지 않습니다. 마지막 문과 관련이 있다는 것을 알고 있지만 if많은 솔루션을 시도했지만 여전히 생활에 갇혀 있습니다. 누구든지 제안 사항이 있으면 도와주세요. 미리 답변해 주셔서 감사합니다. (아래 코드 참조)

    #!/bin/sh
    #who -u | sort -k1,5 > test3
    log=~/Desktop/test3
        while [ -f test ]; do
          while IFS= read line; do
           user=( $line )

            if [ "$olduser" = "${user[0]}" ]; then
              printf '\nThe user %s duplicated' "$olduser"
            fi

           olduser="${user[0]}"
          done<"$log"

            if [[ "$olduser" != "${user[0]}" ]]; then
              printf '\nNo duplication found.\n';
            fi


            #Testing store value                       
            #printf '\nolduser value = %s\n' "$olduser" 
           printf '\n=================================================================\n'
sleep 3
done

답변1

sh귀하의 코드는 표준이 지원하지 않는 두 가지 이상을 사용합니다 .

  1. [[ ... ]]는 POSIX 구문의 확장으로, bash예를 들어 자신만의 조건식을 도입하는 데 사용됩니다.

  2. user=( $line ), 또 다른 POSIX 확장인 배열을 생성합니다 sh.


텍스트 파일에서 중복된 줄을 찾으려면:

sort file | uniq -d

sort입력 파일이 정렬되고 uniq -d연속해서 두 번 이상 나타나는 행만 출력됩니다.

이것을 출력에 사용 who하고 사용자 열(첫 번째 열)에만 관심을 두려면 다음을 수행하십시오.

who | awk '{ print $1 }' | sort | uniq -d

스크립트에서 사용하세요:

who | awk '{ print $1 }' | sort | uniq -d >duplicates.txt

if [ -s duplicates.txt ]; then
    echo 'The following dupes were found:'
    cat duplicates.txt
else
    echo 'No dupes'
fi

-s테스트는 비어 있지 않은 파일에 적합합니다.


셸에서 이 작업을 수동으로 수행하려면 중복 항목이 발견될 때 플래그를 설정하세요.

dupe=0

who | awk '{ print $1 }' | sort -o users.txt

while IFS= read -r user; do
    if [ -n "$prev_user" ] && [ "$user" = "$prev_user" ]; then
        printf 'Duplication for "%s"\n' "$user"
        dupe=1
    fi

    prev_user=$user
done <users.txt

if [ "$dupe" -ne 1 ]; then
    echo 'No dupes'
fi

관련 정보