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"
答案 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
/ ...