如何从文件中提取电子邮件?

Tre*_*rKS 4 grep

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

数据的结构与此类似。

Patabee meeta needo buffalos@outlook.com pizz bees
Needo target@outlook.com hama lines question
unix search exchange helpme@outlook.com extracts
Run Code Online (Sandbox Code Playgroud)

我的数据中一致的一件事是电子邮件域。

目前我有...

grep -oniT @outlook.com /path/to/file/of/emails/and/such.txt
Run Code Online (Sandbox Code Playgroud)

它返回一个很好的输出..

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
Run Code Online (Sandbox Code Playgroud)

但是,我需要它来选择整个电子邮件地址,而不仅仅是域(这是我当前搜索的内容。

如何让 grep 选择它找到匹配字符串的整个字段,而不是整行?

Kev*_*ire 5

这是使用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
Run Code Online (Sandbox Code Playgroud)

这将获得文件中的所有电子邮件地址。您可能希望调整正则表达式以仅匹配特定域。

-E, --extended-regexp 将 PATTERN 解释为扩展的正则表达式

-o, --only-matching 只打印匹配行的匹配(非空)部分,每个这样的部分在一个单独的输出行上。


ilk*_*chu 1

-o仅打印与模式匹配的部分,因此您需要扩展模式以包含@. 使用示例中的地址,捕获任何非空白应该可以:

$ grep -oniTE '[^[:blank:]]+@outlook.com'  foo 
  1:    buffalos@outlook.com
  2:    target@outlook.com
  3:    helpme@outlook.com
Run Code Online (Sandbox Code Playgroud)

但一般来说,电子邮件地址很难解析(它们可能包含带引号的空格),并且上面的内容会丢失一些有效的电子邮件地址(以及包含一些无效的电子邮件地址)。请参阅维基百科和相关标准以了解详细信息。