如何正确构造正则表达式的“grep”linux程序,找到所有的电子邮件,说/etc目录?目前,我的脚本如下:
grep -srhw "[[:alnum:]]*@[[:alnum:]]*" /etc
它工作正常- A看到一些电子邮件,但当我修改它,捕捉一个或多个字符之前-和之后的“@”符号...
grep -srhw "[[:alnum:]]+@[[:alnum:]]+" /etc
...它完全停止工作了
此外,它不会捕获格式为“Name. LastName@www.example.com“的电子邮件site.com
救命!
9条答案
按热度按时间lxkprmvk1#
这是另一个例子
此变体适用于3级域。
rsaldnfx2#
grep
要求对大多数正则表达式特殊字符进行转义-包括+
。您需要执行以下两种操作之一:rwqw0loc3#
我修改了正则表达式,将其改为包含标点符号(如.-_等
这仍然是相当干净和匹配...嗯,当然,大多数的东西与@在它。也是第三级域,也有'%'或'+'在他们的地址。见http://www.delorie.com/gnu/docs/grep/grep_8.html的字符类使用的好文档。
在我的例子中,地址被白色包围,使得匹配变得非常容易。例如,如果你通过邮件服务器日志进行grep,你可以添加〈〉使它只匹配地址:
@托马斯,@glowcoder和@oedo都是正确的。RFC定义了电子邮件地址的外观,读起来很有趣。(我一直在使用Ubuntu中包含的GNU grep 2.9)。
也可以看看下面的zpea版本,它应该是一个不太喜欢触发的匹配器。
bxgwgixi4#
我用这个来过滤电子邮件地址由'at'符号标识,并由文本中白色隔离:
当然,您可以使用 grep -E 代替 egrep(扩展grep)。注意,tr 命令用于删除典型的电子邮件分隔符。
3hvapo4f5#
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”,并且空格限制会漏掉诸如“www.example.com“之类的内容mailto:person@example.com(从技术上讲不是一封电子邮件,而是包含一封电子邮件);所以我稍微调整了一下。
(Do grep选项的用途,我对它们不是很了解)
lxkprmvk6#
下面这个递归函数非常适合我:
8fsztsew7#
我只想提一下,这种方法的一个小小的变化非常适合从twitter tweet这样的东西中获取提及:
grep -Eiorh '(@[[:alnum:]_.-]+)' "$@" * | sort | uniq -c
zpf6vheq8#
看起来可以工作,但会拾取带有**@**的文件名
rpppsulh9#
我打赌没有比这更好的基本正则表达式了
它不会留下一个单一的电子邮件从垃圾,但你必须要做的事情是,提取如果一些相同的电子邮件,但不是电子邮件,像
home_mobile@1x.png
,要么它需要手动查找或使我提到的正则表达式更具体地对你想要添加更多的特殊字符,但没有基础正则表达式存在这是比这更好