Compare duas listas de usuários no bash

1

Eu tenho duas listas de usuários diferentes. Eu preciso comparar os usuários e verifique se eles existem em ambos os arquivos. Um é o arquivo passwd, e outro é um arquivo simples, pois possui os nomes de usuário e outras informações que podem extrair uma lista de nomes de usuário classificados.

Isso me fornece uma lista classificada dos nomes de usuários:

cat /etc/passwd | cut --fields=1 | sort -k1.2

Existe uma maneira melhor de fazer esse numero um, e numero dois, como eu comparo a outra lista de usuários do outro arquivo? Se o usuário não existir, eu o adicionarei ao arquivo simples.

    
por specto 06.08.2010 / 13:36

6 respostas

7

Isso deve funcionar para você usando a substituição de processos com bash, diff, awk e sort:

diff <(awk -F: '{print $1}' /etc/passwd | sort) <(sort your_other_list_file)

Isso pressupõe que your_other_list_file contenha apenas nomes de usuários, um por linha. Não posso ajudá-lo a analisar isso, a menos que você poste uma linha de exemplo.

    
por 06.08.2010 / 14:28
3

comm -3 < ((cut -f1 -d: /etc/passwd | sort)) < (ordenar arquivo2)

Eu gosto disso melhor, é uma linha direta, evita o awk e comm oferece opções para fornecer entradas exclusivas para list1, list2 ou comuns a ambas. Também o corte antes da ordenação permite ordenar cadeias de caracteres mais curtas para trabalhar, por isso pode ser mais rápido em listas mais longas.

    
por 23.03.2011 / 00:08
2

Digamos que seu arquivo simples se pareça com este exemplo:

data info username number status

Então você pode fazer isso:

join -v 1 -1 1 -2 3 <(sed 's/:/ /g' /etc/passwd | sort) <(sort your_file) >> your_file

Isso acrescenta linhas que aparecem no arquivo um ( -v 1 ) que não aparecem no arquivo dois no final do arquivo dois. Os campos para correspondência são o campo 1 para o arquivo um e o campo 3 para o arquivo dois. O comando sed compensa o arquivo de senha sendo delimitado por dois pontos e o arquivo simples delimitado por espaço. Você pode ajustar números de campos e delimitadores para atender às suas necessidades.

    
por 06.08.2010 / 16:28
1

Você pode ver facilmente quais linhas não estão presentes de um arquivo para outro com o grep:

fgrep -vxf file1 file2

Ele mostrará as linhas presentes no arquivo2, mas não no arquivo1. (Observe a ordem dos argumentos)

    
por 22.03.2011 / 21:17
0

Que tal usar diff ? Apenas execute diff file_a file_b e você obterá um arquivo diff com todas as mudanças. Depois disso, você pode simplesmente filtrar um + para obter as linhas que faltam.

Observe que, para que diff funcione corretamente, você provavelmente precisará classificá-lo primeiro.

    
por 06.08.2010 / 13:42
0
cat /etc/passwd1 | cut -d':' -f1 | sort > passwd_file1
cat /etc/passwd2 | cut -d':' -f1 | sort > passwd_file2
diff passwd_file1 passwd_file2

Você também pode classificá-lo e diferenciá-lo sem cortes para obter informações completas.

    
por 06.08.2010 / 13:41