如何从文件中 grep 电子邮件?

如何从文件中 grep 电子邮件?

我有一长串需要提取的电子邮件地址,但是我找不到正确的方法。

数据的结构与此类似。

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]

但一般来说,电子邮件地址是难的来解析(它们可以包含引用的空格),上面的代码将丢失一些有效的电子邮件地址(以及包括一些无效的地址)。参见例如维基百科以及血腥细节的相关标准。

相关内容