awk - 比较 2 个文件并使用 md5 函数

awk - 比较 2 个文件并使用 md5 函数

我需要对第二个文件(md5)的每一行进行哈希处理,并将其与第一个文件逐行进行比较,如下所示:

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

我该如何使用 来做到这一点awk

文件1:

5ca4136a060a2574a936cdf6881f733c
8068123f8384b305d133add978a3c12c

文件2:

[email protected]
[email protected]

并以这个例子:

5ca4136a060a2574a936cdf6881f733c = [email protected]

输出:

[email protected]

答案1

尝试。

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

输入:

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

输出(在 file1 中看到其哈希值的邮件地址):

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

使用起来grep非常简单。

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

答案2

使用joinPerl 进行 MD5 计算,在bashor ksh93、 or中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被告知将文件中排序后的 MD5 哈希值与邮件地址以及 MD5 文件中找到的哈希值连接起来,并打印地址文件中每个不匹配的行。

哈希值也会被打印出来,但是你可以使用以下命令过滤掉它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]

Perl 代码的输出在表格中

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

这就是排序并赋予 的内容join。默认情况下,连接将发生在第一个空格分隔的字段上。

相关内容