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

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

Re: [shell-script] Desempenho ao checar se string existe em arquivo de t


From: Fernando Mercês
Subject: Re: [shell-script] Desempenho ao checar se string existe em arquivo de texto
Date: Tue, 20 Jan 2015 13:56:29 -0200

Galera, desculpe a demora!

@Paulo, muito legal. Não conhecia o comm. Obrigado!

@Sidney, não queria complicar o script, mas te agradeço a sugestão.

@LuisFernando, não tinha pensado em array. Valeu!

Eu precisei do sed porque preciso capturar somente o nome de usuário no padrão "invalid user usuario". Não consegui fazer isso com o grep. Uma solução seria grep | cut -d' ' -f3 mas o sed faz sem pipe. :)

@Julião, nunca mais vou esquecer da opção -f do grep. haha O arquivo /etc/passwd, se tratado, é exatamente o que eu precisaria para um grep. Eu não tinha me ligado. Muito legal "ver" isso.

@LuizAlberto, eu queria justamente evitar o loop mas te agradeço cara!

@Ronaldo, muito legais teus exemplos. Muito obrigado!

Com meus arquivos gigantes, o awk se mostrou melhor que o sort+cut+uniq (opção d do Ronaldo). Só perdeu quando otimizei a opção c, também sugestão do Julio, de suar o grep -f:

grep -xFf <(cut -d: -f1 /etc/passwd) "$outfile"

Coloquei o -F (fast grep, antigo fgrep) e este superou inclusive o awk. Valeu mesmo galera. Muito aprendizado hoje! :)

Grande abraço. Essa lista arrebenta!


Att,

Fernando Mercês
Linux Registered User #432779
www.mentebinaria.com.br
------------------------------------
"Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de mudança é preciso mudar". (Elliot Gould)

2015-01-05 18:06 GMT-02:00 Alfredo Casanova address@hidden [shell-script] <address@hidden>:
 

Caraca, acho que foi o reply em que mais aprendi coisas nessa lista até hoje. Valeu, Ronaldo.



On Wed Dec 24 2014 at 3:04:23 PM Ronaldo Ferreira de Lima address@hidden [shell-script] <address@hidden> wrote:

On Tue, Dec 23, 2014 at 11:36:39PM -0200, Fernando Mercês address@hidden [shell-script] wrote:
> Amigos,
> Num script que acabei de fazer [1] tenho um arquivo de texto que é uma lista de
> nomes de usuário (um por linha). E quero checar se eles existem no sistema. Fiz
> deste jeito:
>
> while IFS= read i; do
> grep -qm1 "^$i:" /etc/passwd && echo "$i matches with an existent user. Be careful!"
> done < "$outfile"
>
> Mas este "$outfile" é muito grande. Milhares de linhas e demora um pouco.
> Alguma ideia pra otimizar?

Sim, algumas:

a. associative arrays:
declare -A username
while IFS=$':\n' read user last; do
let "username[$user] += 1"
(( username[$user] > 1 )) && echo $user
done < <(cat /etc/passwd usernames.txt)

b. awk:
awk -F: 'a[$1]++' /etc/passwd usernames.txt

c. grep -f + cut:
grep -x -f <(cut -d: -f1 /etc/passwd) usernames.txt

d. sort+cut+uniq:
sort <(cut -d: -f1 /etc/passwd) usernames.txt|uniq -d

Nos meus testes, 'usernames.txt' é o equivalente ao seu $outfile e é um
arquivo com 1k usernames e apenas 1 existente no /etc/passwd. Assumi
também que não existem duplicidade dentro do $outfile.

Realizei um benchmark com uma ferramenta desenvolvida a princípio para
testar código Perl mas que produz um relatório bem legível:

Benchmarking a => sub { system q(bash associative_array.sh 2&>/dev/null) }, b => sub { system q(bash awk.sh &>/dev/null) }, c => sub { system q(bash grep-f+cut.sh &>/dev/null) }, d => sub { system q(bash sort+cut+uniq.sh &>/dev/null) } ...
Benchmark: timing 1000 iterations of a, b, c, d...
a: 37 wallclock secs ( 0.01 usr 0.13 sys + 32.94 cusr 2.59 csys = 35.67 CPU) @ 28.03/s (n=1000)
b: 7 wallclock secs ( 0.02 usr 0.11 sys + 4.78 cusr 1.29 csys = 6.20 CPU) @ 161.29/s (n=1000)
c: 8 wallclock secs ( 0.01 usr 0.11 sys + 4.91 cusr 1.13 csys = 6.16 CPU) @ 162.34/s (n=1000)
d: 6 wallclock secs ( 0.01 usr 0.11 sys + 3.50 cusr 1.53 csys = 5.15 CPU) @ 194.17/s (n=1000)

O campeão aqui foi o 'sort+cut+uniq'. Não consegui incluir o seu código
nos testes porque demorava muito a conclusão na minha máquina. Ele fica
abaixo de 1/s e fica muito aquém dos outros exemplos.

Como última observação, dependendo do tamanho do /etc/passwd, do
$outfile e da quantidade duplicatas, esses valores podem mudar.



> Grato e feliz natal! :)
> [1] https://gist.github.com/merces/0a4d2272d79d00cc0fe1
> Att,
>
> Fernando Mercês
> Linux Registered User #432779
> www.mentebinaria.com.br
> ------------------------------------
> "Ninguém pode ser escravo de sua identidade; quando surge uma possibilidade de
> mudança é preciso mudar". (Elliot Gould)

[]'s
--
"Não manejo bem as palavras
Mas manipulo bem as strings."
------------------------------
http://tecnoveneno.blogspot.com



reply via email to

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