Como obtenho uma lista de usuários não presentes em um arquivo CSV do / etc / passwd?

3

Eu preciso comparar a lista de usuários ( /etc/passwd ) a um arquivo de conta .csv e obter a conta de /etc/passwd que não estão no meu arquivo csv.

/etc/passwd mostra:

root:x:0:0:root:/root:/bin/bash
albert:x:521:521:auto:/home/albert:/bin/bash
alfred:x:521:521:auto:/home/alfred:/bin/bash
O arquivo

.csv mostra:

albert,abc123

A saída esperada é:

root
alfred

Eu tentei por 2 dias com awk e grep, mas o resultado não é o que eu preciso ..

    
por Alexander 17.02.2016 / 01:43

2 respostas

4

Uma combinação de grep , tr , cut e substituição de processo:

cut -d: -f1 /etc/passwd | grep -xvFf <(tr ',' '\n'  < file.csv)

O comando cut obtém os nomes de usuários de /etc/passwd (o primeiro campo : -delimited).

Em seguida, o comando tr converte seus campos CSV em um nome de usuário por linha.

O comando grep procura linhas inteiras ( -x ) que não correspondem ( -v ) a nenhum padrão fixo ( -F ) de um arquivo contendo padrões, um por linha ( -f ). Usamos a substituição do processo ( <() ) para usar a saída de tr para esses padrões.

    
por muru 17.02.2016 / 02:12
2

Não tão suave quanto a solução de muru, mas de outra forma usando comm , tr e cut e sort :

comm -13 <(<file tr ',' '\n' | sort) <(cut -d ':' -f 1 /etc/passwd | sort)
  • comm -13 <(<file tr ',' '\n' | sort) <(cut -d ':' -f 1 /etc/passwd | sort) : compara as linhas na saída de <file tr ',' '\n' | sort e cut -d ':' -f 1 /etc/passwd | sort e imprime apenas as linhas exclusivas para cut -d ':' -f 1 /etc/passwd | sort ;
  • <file tr ',' '\n' | sort : lê STDIN de file , traduz vírgulas para novas linhas e classifica o arquivo de saída;
  • cut -d ':' -f 1 /etc/passwd | sort : imprime o primeiro campo separado por dois pontos de cada linha em /etc/passwd e classifica o arquivo de saída;

E outra forma de usar combine (no moreutils package: sudo add-apt-repository universe && sudo apt-get update && sudo apt-get install moreutils ), que permite salvar alguns comandos sort (embora provavelmente combine classifique os arquivos internamente de qualquer forma):

combine <(cut -d ':' -f 1 /etc/passwd) NOT <(<file tr ',' '\n')
  • combine <(cut -d ':' -f 1 /etc/passwd) NOT <(<file tr ',' '\n') : compara as linhas na saída de cut -d ':' -f 1 /etc/passwd e <file tr ',' '\n' e imprime apenas as linhas exclusivas para cut -d ':' -f 1 /etc/passwd ;
  • <file tr ',' '\n' : lê STDIN de file e traduz vírgulas para novas linhas;
  • cut -d ':' -f 1 /etc/passwd : imprime o primeiro campo separado por dois pontos de cada linha em /etc/passwd ;
por kos 17.02.2016 / 02:15