如何在许多大型文件中查找电子邮件

时间:2015-05-27 08:29:16

标签: regex grep

OS Ubuntu 14.04 64位LTS - 最小安装 - 更新。

规格: 2x 6核Xeon, 12 GB ECC内存, 存储RAID 10 = 4 TB, 文件系统= ext4,

以上服务器专用于此项目。

期望的结果: 更有效地使用grep,减少误报,并且更清洁"结果并仅将电子邮件帐户导出到txt文件。

概述: 我有许多各种格式的大文件,.csv,.excel,.txt,.sql等 一些文件是压缩zip,rar,gz等(我将尝试zgrep下一步) 这些文件驻留在Windows 2012服务器上,我已将该共享安装在Ubuntu框中,我需要将所有电子邮件提取到txt文件。

我已经完成了大量研究和使用各种正则表达式,但无法按预期100%运行。

示例:

首次尝试:

grep -Rs .*@.* . >> emails.txt

第二次尝试:(研究后)

grep -e '^.*\@.*\..*' -r -n -h >> emails.txt

第三次尝试:(为了更好的表现)

LANG=C grep -e '^.*\@.*\..*' -r -n -h >> emails.txt

第四次尝试:(甚至"更好"性能,但这取决于硬件)

cat * */* */*/* | parallel --pipe -N 250 --round-robin “grep -e '^.*\@.*\..*' -r -n -h >> emails.txt"

问题:

通过第一次和第三次尝试,我仍然得到了大量的垃圾"出口。 第四个示例cat仍抱怨文件夹,我尝试使用find .运行它,但后来我只得到输出中包含邮件帐户的文件。

更新: 2015年5月27日 - 格林尼治标准时间1:35

经过对此论坛和令人惊叹的社区的更多测试和输入后,我现在已经解决了以下问题:

grep + email regex示例:

grep -r -o -n -h '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt

grep -r -o -n -h '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i

变体形式:

grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt

grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i

仍在测试/进行中:

潜在的速度增加:

LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt

LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' . >> emails.txt | sort | uniq -i

管道并行并分成多个进程(应该提高硬件速度):

cat * */* */*/* | parallel --pipe -N 250 --round-robin “grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt"

cat * */* */*/* | parallel --pipe -N 250 --round-robin “grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt | sort | uniq -i"

管道并行并分成多个进程(应该提高硬件的速度),包括LANG = C:

cat * */* */*/* | parallel --pipe -N 250 --round-robin “LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt"

cat * */* */*/* | parallel --pipe -N 250 --round-robin “LANG=C grep -ronh '[[:alnum:]+\.\_\-]*@[[:alnum:]+\.\_\-]*' >> emails.txt | sort | uniq -i"

1 个答案:

答案 0 :(得分:0)

  

获得大量“垃圾”出口

您可以使用匹配得更好的电子邮件正则表达式,例如来自this SO answer

^[a-zA-Z0-9.!#$%&'*+/=?^_`{|}~-]+@[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0‌​-9]‌​)?(?:\.[a-zA-Z0-9](?:[a-zA-Z0-9-]{0,61}[a-zA-Z0-9])?)*$

(但也许@fedorqui的那个更适合。)

  

我尝试用find .运行它,但后来我只得到那些文件   包含输出中的邮件帐户

命令

$ find . -type f -exec cat {} \; | grep myregex

为您提供当前工作文件夹(cat file)中每个文件(-type f)的内容(每个项目.)。如您所见,您可以将其发送至grep / xargs / parallel / ...