![如何从文件中 grep 电子邮件?](https://linux22.com/image/134647/%E5%A6%82%E4%BD%95%E4%BB%8E%E6%96%87%E4%BB%B6%E4%B8%AD%20grep%20%E7%94%B5%E5%AD%90%E9%82%AE%E4%BB%B6%EF%BC%9F.png)
我有一长串需要提取的电子邮件地址,但是我找不到正确的方法。
数据的结构与此类似。
Patabee meeta needo [email protected] pizz bees
Needo [email protected] hama lines question
unix search exchange [email protected] extracts
我的数据中一致的一件事是电子邮件域。
目前我有...
grep -oniT @outlook.com /path/to/file/of/emails/and/such.txt
它返回一个很好的输出..
3624 :@outlook.com
3625 :@outlook.com
3626 :@outlook.com
3630 :@outlook.com
3631 :@outlook.com
3632 :@outlook.com
3633 :@outlook.com
3634 :@outlook.com
3635 :@outlook.com
然而,我需要它来选择整个电子邮件地址,而不仅仅是域(这是我当前搜索的内容)。
我怎样才能让 grep 选择它找到匹配字符串的整个字段,而不是整行?
答案1
这是一个使用的解决方案grep:
grep -E -o "\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b" /path/to/file/of/emails/and/such.txt
这将获取文件中的所有电子邮件地址。您可能需要调整正则表达式以仅匹配特定域。
-E, --extended-regexp 将 PATTERN 解释为扩展正则表达式
-o, --only-matching 仅打印匹配行的匹配(非空)部分,每个此类部分位于单独的输出行上。
答案2
-o
仅打印与模式匹配的部分,因此您需要扩展模式以包含@
.使用示例中的地址,捕获任何非空白应该可以:
$ grep -oniTE '[^[:blank:]][email protected]' foo
1: [email protected]
2: [email protected]
3: [email protected]
但一般来说,电子邮件地址是难的来解析(它们可以包含引用的空格),上面的代码将丢失一些有效的电子邮件地址(以及包括一些无效的地址)。参见例如维基百科以及血腥细节的相关标准。