如何正确构建"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级域.
grep需要转义大多数正则表达式特殊字符 - 包括+.你会想做这两个中的一个:
grep -srhw "[[:alnum:]]\+@[[:alnum:]]\+" /etc
egrep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc
Run Code Online (Sandbox Code Playgroud)
我修改你的正则表达式,包括标点符号(如.-_ 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版本,它应该是一个不那么触发快乐的匹配器.