使用grep查找所有电子邮件

Ant*_*nAL 16 linux grep

如何正确构建"grep"linux程序的正则表达式,找到所有的电子邮件,说/ etc目录?目前,我的脚本如下:

grep -srhw "[[:alnum:]]*@[[:alnum:]]*" /etc
Run Code Online (Sandbox Code Playgroud)

工作正常 - 看一些电子邮件,但是当我修改它时,要在"@"符号之前和之后捕捉一个或多个字符...

grep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc
Run Code Online (Sandbox Code Playgroud)

..它根本停止工作

此外,它不会收到"Name.LastName@site.com"形式的电子邮件

救命 !

mos*_*osg 20

这是另一个例子

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

此变体适用于3级域.

  • 这是一个糟糕的答案.它将`fred + smith @ company.com`转换为`smith @ company.com`,删除`fred +`.使用加号在Gmail中非常常见.官方电子邮件地址规范(RFC 5322)中也允许使用许多其他特殊字符. (3认同)
  • +1,好指针。这是一个轻微的变体 "grep -Eiorh '([[:alnum:]|\._.-]+@[[:alnum:]_.-]+?\.[[:alpha:].]{2 ,6})' "$@" * | sort | uniq > emails.txt" 也考虑了 '.' 在电子邮件中 (2认同)

Cas*_*bel 6

grep需要转义大多数正则表达式特殊字符 - 包括+.你会想做这两个中的一个:

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

egrep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc
Run Code Online (Sandbox Code Playgroud)

  • 有时候,登录会有下划线,所以我会在表达式中添加一个下划线:"[[:alnum:] | _]\+ @ [[:alnum:]]\+" (2认同)

Flo*_*ser 5

我修改你的正则表达式,包括标点符号(如.-_ etc),将其改为

egrep -ho "[[:graph:]]+@[[:graph:]]+"
Run Code Online (Sandbox Code Playgroud)

这仍然是相当干净和匹配......当然,大多数东西都带有@.也是第三级域名,也包含'%'或'+'.有关所用字符类的详细文档,请参见http://www.delorie.com/gnu/docs/grep/grep_8.html.

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

egrep -ho "<[[:graph:]]+@[[:graph:]]+>"
Run Code Online (Sandbox Code Playgroud)

@thomas,@ glowcoder和@oedo都是对的.定义电子邮件地址外观的RFC非常有趣.(我一直在使用上面的GNU grep 2.9,包含在Ubuntu中).

还可以查看下面的zpea版本,它应该是一个不那么触发快乐的匹配器.

  • 好答案!但是,最好使用类似`[[:alnum:] ._%+ - ]`而不是`[[:graph:]]`因为`[:punct:]`(包含在`[: graph:]`)包含`@`字符 - 这可能会导致匹配问题 - 以及其他一些不太可能在电子邮件地址中找到的字符. (2认同)