verifica o login duplicado do arquivo

2

Eu tenho uma pergunta sobre o meu código. Estou escrevendo um script Bourne shell que obtém uma lista de usuários do servidor pelo comando who e depois os coloca em um arquivo, então ele verifica o nome por read line e se o script encontrou um nome duplicado ele irá imprimir uma mensagem de aviso com o nome de usuário, caso contrário, será impresso que nenhuma duplicação foi encontrada. Tudo funcionando como deveria quando o script encontrou o nome duplicado, mas quando o script não consegue encontrar nenhum nome duplicado ele não imprime nada, eu sei que é algo a ver com a última declaração if , mas eu tento tantas soluções, mas ainda preso. Se alguém tiver alguma sugestão, por favor me ajude. Muito apreciado e responda com antecedência. (veja o código abaixo)

    #!/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
    
por Prin Puyakul 06.10.2017 / 08:10

1 resposta

2

Seu código usa pelo menos duas coisas que o padrão sh não suporta:

  1. [[ ... ]] , esta é uma extensão da gramática POSIX que, por exemplo, bash usa para introduzir suas próprias expressões condicionais.

  2. user=( $line ) , isso cria uma matriz, que é outra extensão do POSIX sh .

Para encontrar as linhas duplicadas em um arquivo de texto:

sort file | uniq -d

sort classificará o arquivo de entrada e uniq -d somente exibirá linhas que ocorrerão várias vezes sucessivamente.

Para usar isso na saída de who e apenas se preocupe com a coluna do usuário (a primeira coluna):

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

Usando isso em um script:

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

O teste -s será verdadeiro para um arquivo não vazio.

Para fazer isso manualmente no shell, defina um sinalizador quando você encontrar uma duplicata:

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
    
por 06.10.2017 / 08:29