使用grep查找所有电子邮件

如何正确构build“grep”linux程序的正则expression式,find/ etc目录下的所有电子邮件? 目前,我的脚本如下:

grep -srhw "[[:alnum:]]*@[[:alnum:]]*" /etc 

它工作正常 – 一个看到一些电子邮件,但当我修改它,赶上一个或多个字符之前和之后的“@”号…

 grep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc 

它完全停止工作

此外,它不捕获forms为“Name.LastName@site.com”的电子邮件

帮帮我 !

Solutions Collecting From Web of "使用grep查找所有电子邮件"

这是另一个例子

 grep -Eiorh '([[:alnum:]_.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2,6})' "$@" * | sort | uniq > emails.txt 

该变体适用于3个级别的域。

grep要求大部分正则表达式的特殊字符被转义 – 包括+ 。 你会想要做这两个之一:

 grep -srhw "[[:alnum:]]\+@[[:alnum:]]\+" /etc egrep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc 

我修改你的正则表达式包括标点符号(如。-_等)通过改变它

 egrep -ho "[[:graph:]]+@[[:graph:]]+" 

这仍然是相当干净,匹配…呃,当然,大多数与@在任何东西。 此外,还有第三级域名,其中也包含“%”或“+”。 请参阅http://www.delorie.com/gnu/docs/grep/grep_8.html以获取有关所使用字符类的良好文档。

在我的例子中,地址被白色空间包围,使得匹配非常容易。 例如,如果您通过邮件服务器日志进行grep,则可以添加<>以使其仅匹配地址:

 egrep -ho "<[[:graph:]]+@[[:graph:]]+>" 

@thomas,@ glowcoder和@oedo都是正确的。 定义电子邮件地址如何显示的RFC非常有趣。 (我已经使用GNU grep 2.9以上,包括在Ubuntu中)。

另外检查下面的zpea的版本,它应该使一个少触发器匹配。

我已经使用这个来过滤“at”符号所标识的电子邮件地址,并用文本中的空格隔开

 egrep -o "[^[:space:]]+@[^[:space:]]+" | tr -d "<>" 

当然,你可以使用grep -E来代替egrep (扩展grep)。 请注意, tr命令用于删除典型的电子邮件分隔符。

grep -E -o -r "[A-Za-z0-9][A-Za-z0-9._%+-]+@[A-Za-z0-9][A-Za-z0-9.-]+\.[A-Za-z]{2,6}" /etc

这是从一个不是我最初的答案改编的,但是我发现它非常有帮助。 从这里开始:

http://www.shellhacks.com/en/RegEx-Find-Email-Addresses-in-a-File-using-Grep

他们建议:

grep -E -o -r "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" /etc

但它有一定的误报,比如“+ person .. @ example.com”或“person @ .. com”,而空白约束则会错过“mailto:person@example.com”之类的东西(不是技术上的电子邮件,而是包含一); 所以我调整了一下。

(做你想要的选项grep,我不太了解他们)

这个递归的对我来说很好:

 grep -rIhEo "\b[a-zA-Z0-9.-]+@[a-zA-Z0-9.-]+\.[a-zA-Z0-9.-]+\b" /etc/* 

只是想提一下,这个作品的一个微小的变化很适合从twitter推文中获取提及:

grep -Eiorh '(@[[:alnum:]_.-]+)' "$@" * | sort | uniq -c