MrBits,
Modifiquei sua sugestão de acordo com meu script e quer saber?
Nem melhorou tanto assim...... passou de 600ms para 17ms.... um ganho de 
APENAS 3500%

corpo(){
    OLDIFS=${IFS}
    IFS=";"
    while read PC MAC LOCAL SO GW IP STATUS COMENT ; do
        [[ $PC =~ ^srv-.*$ ]] && break
        echo "  "
        [[ "$COMENT" =~ ^$ ]] || echo " # "$COMENT""
        echo "  # $PC ($LOCAL) ($SO) ($STATUS)"
        echo "  host $PC {"
        echo "          hardware ethernet               $MAC;"
        [[ "$IP" =~ ^$ ]] || echo "             
fixed-address                   $IP;"
        [[ "$GW" =~ ^$ ]] || echo "             option 
routers                  $GW;"
        [[ "$SO" == "Win_2000" ]] && win_2000
        echo "  }"
        echo ""
    done < <(grep -v '^#' $Database) >> $DHCPD
    IFS=${OLDIFS}
}


Bom, eu gostaria de entender melhor essa mágica, então vou falar o que 
entendi, usei o "for" pois não sabia que o "while" tinha a facilidade de 
ler o arquivo linha a linha sem usar o IFS para detectar o fim 
dela.(Ainda não tenho total certeza se é exatamente isso, mas pelos 
testes que fiz foi a conclusão que cheguei)
Dessa forma o while pega cada linha completa e manda para o "read" 
fatiar usando o IFS=";" e já atribuindo cada campo a cada variável na 
lista dele.
Dentro do while rolam as comparações e são criadas as linhas que farão 
parte do dhcpd.conf.
Outra coisa que não sabia era da facilidade de poder mandar a saída 
inteira desse while para dentro de um arquivo de uma só vês, da forma 
que vc fez eu imaginava que ele iria imprimir tudo no tty linha a linha, 
percebi também que até funções podem ter sua saída redirecionadas para 
arquivos pois na linha que verifico o S.O se esse for Win_2000 eu chamo 
uma função win_2000 que cria as exceções para esse S.O
Da minha forma para cada linha da base eu escrevia 8x no arquivo de 
saída e agora escrevo apenas 1x para toda a base, é isso mesmo?

Muito bom, adorei o que aprendi hoje!
Se tiver algo que eu entendi errado e você puder explicar melhor ficarei 
bastante grato.


Abraços,
Lawrence Waclawiak


MrBiTs escreveu:
>  
>
> -----BEGIN PGP SIGNED MESSAGE-----
> Hash: SHA256
>
> On 05/03/2010 06:04 PM, Tiago Peczenyj wrote:
> > Para cada | e $( ) vc abre um subprocesso.
> >
> > Como vc faz isso durante MUITAS vezes o processo vai ser lento porem, se
> > dura menos de 1 segundo, eu nao acho isto lento IMHO.
> >
> > Se vc criar um script awk no lugar do script shell vc nao tera esse 
> overhead
> > dependendo de como vc cria-lo.
>
> Acho que usar o IFS do jeito certo (você está usando do jeito errado; 
> está setando o IFS exatamente para o que ele já é na função
> corpo) é ainda mais rápido. Além disso, você grava no arquivo de saída 
> variável por variável. Faça uma gravação de uma vez.
>
> Já que sabemos quantos e quais são os campos, talvez algo assim:
>
> http://pastebin.com/AChJJLd9 <http://pastebin.com/AChJJLd9>
>
> Aqui não deu nem um segundo para comer sua base.
>
> >
> >
> > 2010/5/3 Lawrence Waclawiak <lawrence...@yahoo.com.br 
> <mailto:lawrencebbw%40yahoo.com.br>>
> >
> >>
> >>
> >> Boa tarde a todos,
> >>
> >> Desenvolvi um script para gerar o arquivo dhcpd.conf a partir de uma
> >> base de dados salva em arquivo de texto simples com cada maquina em uma
> >> linha e os campos separados por ;(ponto e virgula).
> >> O formato dessa base de dados é o seguinte:
> >>
> >> #nome;mac;local;so;gw;ip;status;comentario;
> >>
> >> 
> pc-301;00:e0:7d:f4:c6:cb;Cobrança;Win_XP;10.10.48.1;10.10.48.20;Manutencao;;
> >> pc-302;00:1D:7d:83:fe:d1;Cobrança;Win_2000;;;Ativo;;
> >> pc-303;00:1f:c6:60:47:86;Cobrança;Win_XP;;;Ativo;;
> >> pc-304;00:1c:c0:43:62:b5;Cobrança;Win_XP;;;Ativo;;
> >>
> >> A base completa encontra-se em:
> >> http://pastebin.com/Hx7Bpjgj <http://pastebin.com/Hx7Bpjgj>
> >>
> >> O script que criei utiliza o cut dentro de um for para recuperar os 
> campos.
> >>
> >> Pc=$(echo $LINE |cut -d";" -f1)
> >> Mac=$(echo $LINE |cut -d";" -f2)
> >> Local=$(echo $LINE |cut -d";" -f3)
> >> So=$(echo $LINE |cut -d";" -f4)
> >> Gw=$(echo $LINE |cut -d";" -f5)
> >> Ip=$(echo $LINE |cut -d";" -f6)
> >> Status=$(echo $LINE |cut -d";" -f7)
> >> Coment=$(echo -e $LINE |cut -d";" -f8)
> >>
> >> O script completo encontra-se em:
> >> http://pastebin.com/xLLzMkKL <http://pastebin.com/xLLzMkKL>
> >>
> >> A função que trata dessa separação é a função corpo().
> >>
> >> Tudo funciona corretamente porém a maquina demora um pouco para
> >> processar toda a lista e montar o dhcpd.conf, gostaria de saber se
> >> alguém conhece uma forma mais eficiente de recuperar o valor desses
> >> campos que não seja o que eu utilizei nem o awk -F';' '{print $x}' pois
> >> esse é mais pesado ainda.
> >> A maquina que estou utilizando é bastante forte, um dell poweredge 1950
> >> 8Gb de ram 2 processadores xeon quadcore de 2.8Ghz e memso assim para
> >> processar essa pequena base leva cerca de 600ms medidos com o 
> comando time.
> >>
> >> Muito obrigado!
> >>
> >>
> >>
> >
> >
> >
>
> - --
>
> Um abraço
>
> .0. MrBiTs - mrbits....@gmail.com <mailto:mrbits.dcf%40gmail.com>
> ..0 GnuPG - 
> http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x6EC818FC2B3CA5AB 
> <http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x6EC818FC2B3CA5AB>
> 000 http://www.mrbits.com.br <http://www.mrbits.com.br>
>
> -----BEGIN PGP SIGNATURE-----
> Version: GnuPG v1.4.9 (GNU/Linux)
>
> iQEcBAEBCAAGBQJL30QdAAoJEG7IGPwrPKWrr+kIAIOw7JBccnG32ymbbE1V0P1L
> 5suDVIF1tCg9lLNO2R3hXsuUxpq2R9gkK193uoncKlYxH5wZVoJ2PIFxf43BU8CH
> 0fqw2i1PubaGpdMYJvU1IloYpr6i6i62ZZLcMt98QbIHXa2ubx/0a8dDQ1d6u2zR
> edLZNtxn3YY3y/1/lDMRRfAbx70Nj1n+Fb1MiYidMhIGBIkCtKKBns6Rpug8FSnQ
> oRXhFSVkJV4aoX6E4RhaYFTztv5pDV5Vre7SILGuMyDkvVSl4QSFwtMyxatawCCZ
> 4GMeCbEOYuOgmgKXykzky0fuOakzELlzDI1i93tcF+2mk0uRtw8h6qVD2YrWqpo=
> =2j/V
> -----END PGP SIGNATURE-----
>
> 


Responder a