shell-script-pt
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [shell-script] Substituir um Arquivo Com Informação de Outros Dois


From: Fabiano Caixeta Duarte
Subject: Re: [shell-script] Substituir um Arquivo Com Informação de Outros Dois
Date: Thu, 14 Aug 2008 07:48:08 -0300

2008/8/13 Anderson - Listas <address@hidden>

> 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]



reply via email to

[Prev in Thread] Current Thread [Next in Thread]