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

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

RES: [shell-script] Acho que eh eval


From: Julio Cezar Neves - DATAPREVRJ
Subject: RES: [shell-script] Acho que eh eval
Date: Thu, 28 Apr 2005 15:16:09 -0300

Fala Gustavo,
achei muito bacana sua exposição, mas não estou entendendo mais nada pelo
seguinte: até onde eu saiba, uma das grandes vantagens do xargs é que ele
trata simultaneamente a maior massa de dados possível (limitado pela memória
ou parâmetro do sistema), exceto qdo vc usa as opções -l ou -n qdo vc indica
qtas informações ou linhas vc deseja tratar.

Qdo vc me mandou o strace fui fazer uns testes, usando as opções -n10, -n1
-l1, -l10 e nenhum funcionou. Não sei se isso é alguma incompatibilidade com
substituição de processos (que ainda não está 100%) ou se entendi tudo que
li sobre xargs errado (acho isso mais difícil pq já fiz muito teste).

Mas somente como complemento, veja a execução no ambiente de teste:

Prompt> grep -f <(cat Relatorio_de_nomes_incompleto.txt | xargs  -i echo
^{}) <(ls --color=none)
AeroSmith
Jefferson
Jurema
Prompt> ls | grep -f <( <Relatorio_de_nomes_incompleto.txt xargs -i echo
^{})
Prompt> ls | grep -f <(sed 's/^/\^/' Relatorio_de_nomes_incompleto.txt)

Ou seja: teóricamente a sua solução está perfeita, mas no meu velho Bash não
funciona e este é um problema que freqüentemente me defronto, deveria
funcionar, não funciona e não sei a quem recorrer devido à especificidade.

[ ]s,
Julio
:wq

| -----Mensagem original-----
| De: Gustavo Chaves [mailto:address@hidden]
| Enviada em: quinta-feira, 28 de abril de 2005 13:22
| Para: address@hidden
| Assunto: Re: [shell-script] Acho que eh eval
| 
| 
| >>>>> On Thu, 28 Apr 2005 12:35:37 -0300, Julio Cezar Neves - 
| DATAPREVRJ <address@hidden> said:
| 
|   Prompt> cat Relatorio_de_nomes_incompleto.txt
|   > Jurem
|   > AeroS
|   > Jeffe
|   > Felip
|   Prompt> ls -l | grep ^d
|   > drwxr-xr-x    2 jneves   jneves       4096 Abr 27 14:31 AeroSmith
|   > drwxr-xr-x    2 jneves   jneves       4096 Abr 27 14:31 Jefferson
|   > drwxr-xr-x    2 jneves   jneves       4096 Abr 27 14:31 Jurema
|   Prompt> grep -f <(cat Relatorio_de_nomes_incompleto.txt | 
| xargs  -i echo
|   > ^{}) <(ls --color=none)
|   > AeroSmith
|   > Jefferson
|   > Jurema
| 
| Julio, eu acho que o Felipe tem razão quando fala do problema de
| desempenho desta solução.  O xargs vai disparar um processo diferente
| pra cara linha do arquivo Relatorio_de_nomes_incompleto.txt.  Eu usei
| o strace no Linux pra capturar todas as chamadas ao execve e contei o
| seguinte:
| 
| Oito processos para a sua solução:
| 
| $ grep -f <(cat Relatorio_de_nomes_incompleto.txt | xargs -i 
| echo ^{}) <(ls --color=none)
| 
|   #[pid 13885] execve("/bin/grep", ["grep", "-f", 
| "/dev/fd/63", "/dev/fd/62"], [/* 38 vars */]) = 0
|   #[pid 13888] execve("/bin/ls", ["ls", "--color=none"], [/* 
| 38 vars */]) = 0
|   #[pid 13887] execve("/usr/bin/xargs", ["xargs", "-i", 
| "echo", "^{}"], [/* 38 vars */]) = 0
|   #[pid 13886] execve("/bin/cat", ["cat", 
| "Relatorio_de_nomes_incompleto.tx"...], [/* 38 vars */]) = 0
|   #[pid 13889] execve("/bin/echo", ["echo", "^Jurem"], [/* 38 
| vars */]) = 0
|   #[pid 13890] execve("/bin/echo", ["echo", "^AeroS"], [/* 38 
| vars */]) = 0
|   #[pid 13891] execve("/bin/echo", ["echo", "^Jeffe"], [/* 38 
| vars */]) = 0
|   #[pid 13892] execve("/bin/echo", ["echo", "^Felip"], [/* 38 
| vars */]) = 0
| 
| Note que foram quatro 'echo', um pra cada linha do arquivo.
| 
| A primeira melhoria que eu faria é trocar o <(ls --color=none) por um
| mero pipe e sem a opção, já que o ls só usa código de cores se a saída
| for para um terminal.  Com o pipe ele não vai fazer isso:
| 
| $ ls | grep -f <(cat Relatorio_de_nomes_incompleto.txt | 
| xargs -i echo ^{})
| 
|   #[pid 13962] execve("/bin/ls", ["ls"], [/* 38 vars */]) = 0
|   #[pid 13963] execve("/bin/grep", ["grep", "-f", 
| "/dev/fd/63"], [/* 38 vars */]) = 0
|   #[pid 13966] execve("/usr/bin/xargs", ["xargs", "-i", 
| "echo", "^{}"], [/* 38 vars */]) = 0
|   #[pid 13965] execve("/bin/cat", ["cat", 
| "Relatorio_de_nomes_incompleto.tx"...], [/* 38 vars */]) = 0
|   #[pid 13967] execve("/bin/echo", ["echo", "^Jurem"], [/* 38 
| vars */]) = 0
|   #[pid 13968] execve("/bin/echo", ["echo", "^AeroS"], [/* 38 
| vars */]) = 0
|   #[pid 13969] execve("/bin/echo", ["echo", "^Jeffe"], [/* 38 
| vars */]) = 0
|   #[pid 13970] execve("/bin/echo", ["echo", "^Felip"], [/* 38 
| vars */]) = 0
| 
| A segunda melhoria seria trocar o cat por um simples redirecionamento.
| (A não ser que queiramos ganhar o "Useless Use of Cat Award"
| <http://laku19.adsl.netsonic.fi/era/unix/award.html> :-)
| 
| $ ls | grep -f <( <Relatorio_de_nomes_incompleto.txt xargs -i 
| echo ^{})
| 
|   #[pid 13978] execve("/bin/ls", ["ls"], [/* 38 vars */]) = 0
|   #[pid 13979] execve("/bin/grep", ["grep", "-f", 
| "/dev/fd/63"], [/* 38 vars */]) = 0
|   #[pid 13981] execve("/usr/bin/xargs", ["xargs", "-i", 
| "echo", "^{}"], [/* 38 vars */]) = 0
|   #[pid 13982] execve("/bin/echo", ["echo", "^Jurem"], [/* 38 
| vars */]) = 0
|   #[pid 13983] execve("/bin/echo", ["echo", "^AeroS"], [/* 38 
| vars */]) = 0
|   #[pid 13984] execve("/bin/echo", ["echo", "^Jeffe"], [/* 38 
| vars */]) = 0
|   #[pid 13985] execve("/bin/echo", ["echo", "^Felip"], [/* 38 
| vars */]) = 0
| 
| Com isso já conseguimos economizar a chamada ao cat.  Mas o maior
| benefício é substituir o xargs pelo sed pra evitar as múltiplas
| chamadas ao echo:
| 
| $ ls | grep -f <(sed 's/^/\^/' Relatorio_de_nomes_incompleto.txt)
| 
|   #[pid 14010] execve("/bin/ls", ["ls"], [/* 38 vars */]) = 0
|   #[pid 14011] execve("/bin/grep", ["grep", "-f", 
| "/dev/fd/63"], [/* 38 vars */]) = 0
|   #[pid 14013] execve("/bin/sed", ["sed", "s/^/\\^/", 
| "Relatorio_de_nomes_incompleto.tx"...], [/* 38 vars */]) = 0
| 
| Que tal?
| 
| Gustavo.
| 
| 
| ---------------------------------------------------------------------
| Esta lista não admite a abordagem de outras liguagens de 
| programação, como perl, C etc. Quem insistir em não seguir 
| esta regra será moderado sem prévio aviso.
| ---------------------------------------------------------------------
| Sair da lista: address@hidden
| ---------------------------------------------------------------------
| Esta lista é moderada de acordo com o previsto em 
http://www.listas-discussao.cjb.net
---------------------------------------------------------------------
 
Links do Yahoo! Grupos




 




reply via email to

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