2008/8/13 Anderson - Listas <[EMAIL PROTECTED]> > Pessoal, estou precisando de uma ajuda com um pequeno script que estou > montando. > > Não é algo complicado de se fazer, mas algo que com pouco experiência > não estou conseguindo. > > Vamos ao problema: > > Tenho dois arquivos: > > grupos.txt, que o conteudo dele é o seguinte: > grupo:*:usuario1,usuario2,usuario3 (resultado do comando # getent group > > grupos.txt) > > usuarios.txt, que tem as informações dos usuários (resultado do comando > # getent passwd > usuarios.txt) > > Tratei o usuarios.txt da seguinte forma: # cat usuarios.txt | cut -d: > -f1,5 | tr : ' ' para que pegasse apenas o nome de usuário e o nome > completo das pessoas, e substituisse os : por espaço, ficando o arquivo > com o seguinte formato: > usuario Nome Completo do Usuário, o que também tratei e deixei assim: > usuario "Nome Completo do Usuário". > > Agora o que quero fazer: > > pegar todos os usuários pelo username e substituir pelo nome completo no > arquivo grupos.txt, para que, ao invés de ficar vomo está, ele me > mostre o nome completo de cada pessoa que faz parte do grupo, ficando > assim: > > Grupo1:*:Nome Completo, Nome Completo 2, Nome Completo 3 > > Então o que pensei, pego a primeira referência de cada arquivo, e com um > sed eu substituo. Se fosse fazer na mão, ficaria algo como: > # cat grupos.txt | sed 's/usuario/\"Nome Completo\"/' > > Isso funciona para cada um, mas se fosse para fazer manualmente não > estaria fazendo um script ;-) > > Com isso resolvi fazer um laço para pegar o conteúdo de cada linha e > jogar em uma variável para fazer a substituição do arquivo, o que > começou mais ou menos assim: > > #!/bin/bash > for i in $(cat usuarios.txt | cut -d' ' -f1) ; > do > VAR1=$i > done ; > > for j in $(cat usuarios.txt | cut -d\" -f2) ; > do > VAR2=$j > done ; > > > E foi ai que me enrosquei. Pois, somente com isso, ele irá listar as > linhas e jogá-las nas variáveis, mas com esse laço for vai ocorrer que > as variáveis irão armazenar, dessa forma, a ultima ocorrência dos dois > laços, correto? Então pensei que esses laçoes devam estar dentro de um > while, talves, checando algo como: > > CONT=`cat usuarios.txt | wc` > while [ $CONT -ge 0 ] ... > > > E com isso pegar cada linha do cat, para que ele faça algo como, pege a > VAR1 e compare com a linha do grupo que possua o mesmo nome de usuário e > substitua por VAR2. > > Mas depois disse me enrosquei e fiquei na mão. Talvés existam formas, e > acredito que sim, muito mais fáceis de fazer isso, mas didaticamente > falando, poderiam dizer como terminar esse script, e se puderem oferecer > uma solução amigável além da explicação seria bom para o aprendizado e > para que da próxima vez eu não tenha que escrever um romance para obter > ajuda. > > Obrigado pela atenção. >
Para evitar se enroscar, como você diz, pense de forma simples (não simplista). E para aprender mesmo não se preocupe, o segredo não está em escrever e, sim, em ler. "Devore" www.julioneves.com, mas não se restrinja a ele. Suponhamos que os arquivos estejam assim: cat grupos shelleiros:*:anderson,fabiano cat usuarios fabiano Fabiano Caixeta Duarte anderson Anderson Listas da Silva while read login nome; do sed -i "s/\b$login\b/$nome/" grupos done < usuarios O script acima simplesmente lê pares (login,nome) oriundos do arquivo usuarios e substitui o primeiro pelo segundo utilizando o modo 'in-place' do sed. As bordas '\b' evitam que o sed substitua erroneamente logins que sejam parte de outros logins (anderson x andersonls p. ex). É isto. -- Fabiano Caixeta Duarte Especialista em Redes de Computadores Linux User #195299 Ribeirão Preto - SP [As partes desta mensagem que não continham texto foram removidas]