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

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

Re: [shell-script] Qual a forma mais eficiente para recuperar campos de


From: Lawrence Waclawiak
Subject: Re: [shell-script] Qual a forma mais eficiente para recuperar campos de um arquivo de texto?
Date: Mon, 03 May 2010 20:33:26 -0300
User-agent: Thunderbird 2.0.0.23 (X11/20090817)

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 <address@hidden <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 - address@hidden <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-----






reply via email to

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