Como adicionar usuários de .csv por campo específico?

6

Estou tentando classificar meus usuários em servidores específicos, então o que estou tentando fazer no momento é pegar todos os usuários por sexo. Essencialmente, eu teria um servidor com todos os usuários do sexo masculino e um com todos os usuários do sexo feminino. Os dados no arquivo por linha são lidos da seguinte forma:

jimlee,7676,jim lee,sony,male,8912,1543,33:44

O comando que estou usando abaixo pega o primeiro campo e adiciona o usuário. No entanto, meu objetivo é adicionar apenas um gênero específico e criar um usuário para ele. Então, vendo como o quinto campo é o campo de gênero, sei que usar -f5 me dará esse campo e exibiria todos os usuários por sexo, mas não sei como obter o nome com base em um campo específico, nesse caso o quinto campo (gênero).

cut -d ',' -f1 file.csv | while read line; do sudo useradd "$line"; done
    
por Danny 05.02.2017 / 23:02

4 respostas

7

Continuação da minha resposta anterior em sua outra pergunta Como pegar caracteres antes da vírgula em uma lista e exportar para um script? , use o awk com $FIELD == "word" . Aqui macho e fêmea são colocados no campo 5

awk -F',' '=="male" {command=sprintf("useradd \"%s\" ",); system(command) }' input.txt

Você pode fazer o mesmo para "feminino"

    
por Sergiy Kolodyazhnyy 05.02.2017 / 23:18
7

Você poderia tentar

sudo awk -F , '(=="male") {system("useradd " )}' file.csv
    
por Nick Sillito 05.02.2017 / 23:15
2

Se você quiser procurar por um padrão e os campos podem ser inconsistentes (ou seja, se o gênero não estiver sempre no 5º campo), você pode usar uma maneira sed para pegar o primeiro campo se female estiver em qualquer campo, por exemplo:

sed -nr 's/^([^,]+),.*,female,.*//p' file

Explicação

  • -n não imprime até pedirmos algo
  • -r use ERE
  • s/old/new replace old com new
  • ^([^,]+), salva alguns caracteres antes de uma vírgula no início de cada linha (o primeiro campo)
  • ,.*, qualquer número de caracteres que possam ocorrer entre duas vírgulas (por isso, não importa quantos campos existem entre o primeiro campo e o padrão)
  • ,female, a linha corresponderá apenas se esse padrão ocorrer
  • do padrão salvo em () de antes
  • p imprime apenas as linhas que alteramos
por Zanna 06.02.2017 / 10:56
2

Provavelmente é simples usar um loop de Bash com vírgula como separador de campos e chamando useradd quando necessário:

while IFS=, read user f2 f3 f4 gender _;
do
    if [ "$gender" == "male" ]; then
         sudo useradd "$user"
    fi
done < file

Não há necessidade de chamar comandos externos como awk ou sed.

    
por fedorqui 06.02.2017 / 11:27