Como pegar caracteres antes da vírgula em uma lista e exportar para um script? [duplicado]

2

Eu tenho um arquivo contendo uma lista de usuários e informações, cada linha é um usuário separado escrito assim:

alfred,butler,male,70,7:15. 

Eu quero pegar os nomes apenas da lista para que eu possa criar um usuário para eles.

Assim que eu tiver os nomes, posso simplesmente usar um loop for e fazer eco ao useradd com cada um dos nomes de usuário, depois simplesmente copie e cole o texto. Como abordo pegar os personagens antes da primeira vírgula?

    
por Danny 05.02.2017 / 20:04

2 respostas

1

Extrair os nomes é fácil: use o awk com -F para imprimir o primeiro campo

awk  -F, '{print }' input.csv

Para realmente adicionar usuários, você precisa ler a saída do awk, linha por linha. Uma maneira de fazer isso é como o Zanna mostra, com pipe para while read variable ; do . . . done .

Alternativa seria aproveitar a função system() do awk para criar o comando primeiro e passá-lo para a função. Considere isto:

$ awk -F ',' '{command=sprintf("useradd \"%s\"",);print command  }' input.txt                                          
useradd "alfred"
useradd "johnny"

Para cada linha extraímos a primeira palavra e a colocamos em useradd "%s" . Isso pode ser dado à função system() e será executado com /bin/sh

Executando isso como root:

$ awk -F ',' '{command=sprintf("useradd \"%s\" ",); system(command) }' input.txt
$ grep 'alfred' /etc/passwd
alfred:x:1001:1001::/home/alfred:

CUIDADO : system() chamadas /bin/sh , que no Ubuntu é um link simbólico para /bin/dash . Portanto, evite bashisms no comando que você passar

    
por Sergiy Kolodyazhnyy 05.02.2017 / 20:24
1

Você pode usar cut para capturar o primeiro campo e depois canalizar para um loop while para executar comandos com os nomes como entrada:

cut -d ',' -f1 file | while read line; do echo "$line"; done

obviamente este script não está fazendo nada útil como é - substitua echo com o que você quer fazer com cada nome, por exemplo sudo useradd (depois de testar com echo )

Explicação

  • -d ',' usa vírgula como delimitador ( d )
  • -f1 o primeiro campo ( 1 ) ( f )
  • while read line lendo o arquivo, passando o loop sobre cada linha como variável $line
  • do <command> "$line" execute <command> no argumento expandido da variável (isto é, em cada linha da saída canalizada)
por Zanna 05.02.2017 / 20:10