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