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: MrBiTs
Subject: Re: [shell-script] Qual a forma mais eficiente para recuperar campos de um arquivo de texto?
Date: Mon, 03 May 2010 21:18:02 -0300
User-agent: Mozilla/5.0 (X11; U; Linux x86_64; en-US; rv:1.9.1.9pre) Gecko/20100217 Lightning/1.0b1 Shredder/3.0.3pre

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA256

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

Acredite. Também já passei por isso. Essas armadilhas de usar cat | grep | cut 
são clássicas e pegam 11 entre 10 novatos (e outro
tanto de experientes também). As pessoas podem falar que 600ms não é tanto 
assim, mas extrapole isso para um arquivo com algumas
dezenas de gigabytes de dados e você terá idéia do que estamos falando.


> 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}
> }
Que código bonito :P Saiu até formatadinho aqui, com o e-mail recebido em 
texto, sem nenhum HTML para encher o saco :P (não
resisti). Ele ia ficar mais bonito ainda se você tivesse colocado todas as 
variáveis protegidas pelos {}, mas foi falha minha.
Estavam me torrando o saco no engenho e eu queria responder logo.


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

Zero de mágica. Isso é sistema operacional de verdade. E, sim, você está certo. 
Antes você escrevia 8x para cada registro, agora
escreve uma vez para a base. Redirecionamento de entrada e saída padrões é 
muito poderoso.

- -- 

Um abraço

.0. MrBiTs - address@hidden
..0 GnuPG  - 
http://pgp.mit.edu:11371/pks/lookup?op=get&search=0x6EC818FC2B3CA5AB
000 http://www.mrbits.com.br


-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.9 (GNU/Linux)

iQEcBAEBCAAGBQJL32e6AAoJEG7IGPwrPKWrJh8H/3N8mHura6s6iI9UmBqJjUyN
MA8IfJvA7hvPlZxn3e5Yg3zGV9hYbnK7stMFDR7h4dYlY6L0XE7SH3QdzXNC2Ow4
//HUQklX0YvlaaLpnHk9+SOffjRFRGKLbXNF0lx81qqfUr+Z9HNrhEmo8ORbwo+j
Uy6daAuabUqGqsljyD4y1Gu0Y0RKAB+7QfnkFh1Wtns9P/wtNSk4aeYXdXLfTDlY
XkUds9LmaAySXffmzUOQGP89oIWEXd0jPE7qwrHpMn6mswxrOTA57ZxUj2ZaVW1x
Uke4geFYEw/66SvhJ/Uwwm4AFgMKmjz+6iYTOuIcb75PcdW23JuBWFyq2OFs398=
=RzWQ
-----END PGP SIGNATURE-----


reply via email to

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