[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