awk - compare 2 arquivos e use a função md5

0

Eu preciso haxear cada linha do segundo arquivo (md5) e compará-lo com o primeiro arquivo, linha por linha, assim:

awk -F, 'FNR==NR {a[$1]; next}; !(md5($1) in a)' file1 file2 > file3

Como posso fazer isso usando awk ?

file1:

5ca4136a060a2574a936cdf6881f733c
8068123f8384b305d133add978a3c12c

file2:

[email protected]
[email protected]

e com este exemplo:

5ca4136a060a2574a936cdf6881f733c = [email protected]

saída:

[email protected]
    
por Hero 29.09.2017 / 19:21

2 respostas

1

Tente.

awk 'NR==FNR{seen[$0];next}{x="echo " $0 "|md5sum| cut -d- -f1|cut -f1 ";
     x|getline l;close(x);md5[l]=$0} 
END{for (M in md5) {chk=md5[M];gsub (" ", "", M);for (U in seen) if(M==U){print M, chk}}
}' file1 file2

Entradas:

==> file1 <==
5ca4136a060a2574a936cdf6881f733c
8068123f8384b305d133add978a3c12c
96653200bf87722738bc4abf7b3d5589
731a1f0a260d40c758aa18237de3fe6c
==> file2 <==
[email protected]
[email protected]
UNIX.stackexchange.com
STACKECHANGE.COM

Saída (os endereços de e-mail cujo hash foi visto no arquivo1):

731a1f0a260d40c758aa18237de3fe6c UNIX.stackexchange.com
96653200bf87722738bc4abf7b3d5589 [email protected]

Usar grep é muito fácil.

grep -Ff file1 \
    <(awk '{x="echo " $0 "|md5sum| cut -d- -f1"; x|getline l;print l, $0}' file2)

96653200bf87722738bc4abf7b3d5589   [email protected]
731a1f0a260d40c758aa18237de3fe6c   UNIX.stackexchange.com
    
por 29.09.2017 / 20:24
0

Usando join e Perl para fazer o cálculo do MD5, em bash ou ksh93 ou zsh :

$ join -v1 <( perl -MDigest::MD5 -ne 'chomp; printf("%s %s\n",Digest::MD5::md5_hex($_),$_)' text-file | sort ) \
           <( sort md5-file )
5a09ab8a3f03376046a6e6eec0a0d511 [email protected]

join é avisado para juntar os hashes MD5 ordenados do arquivo com os endereços de e-mail, com os encontrados no arquivo MD5, e para imprimir cada linha incompatível do arquivo de endereço.

O hash também é impresso, mas você pode filtrar isso com cut -d ' ' -f 2- :

$ join -v1 <( perl -MDigest::MD5 -ne 'chomp; printf("%s %s\n",Digest::MD5::md5_hex($_),$_)' text-file | sort ) \
           <( sort md5-file ) | cut -d ' ' -f 2-
[email protected]

A saída do código Perl está no formulário

5ca4136a060a2574a936cdf6881f733c [email protected]
5a09ab8a3f03376046a6e6eec0a0d511 [email protected]

e isso é o que é classificado e dado a join . A junção ocorrerá no primeiro campo delimitado por espaço por padrão.

    
por 29.09.2017 / 21:46