使用带有bash或命令行的正则表达式从文本文件中提取电子邮件地址

时间:2013-11-12 22:07:25

标签: regex linux bash

如何使用具有与此类似的多行的文件中的正则表达式来仅显示电子邮件地址。 (确切地说是一个sql转储)

不幸的是,此时我不能再返回并转储电子邮件列。

示例数据:

62372,35896,1,cgreen,Chad,Green,cgreen@blah.com,123456789,0,,,,,,,,,3,Blah,,2013-05-02 17:42:31.659574,164842,,0,0

我试过这个但是没有用:

grep -o '[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}' file.csv

4 个答案:

答案 0 :(得分:34)

如果您仍想使用grep -o路线,这个路线适合我:

$ grep -i -o '[A-Z0-9._%+-]\+@[A-Z0-9.-]\+\.[A-Z]\{2,4\}' file.csv
cgreen@blah.com
$ 

我的路径中似乎有两个版本的grep,2.4.2和2.5.1。只有2.5.1似乎支持-o选项。

你的正则表达式很接近,但你遗漏了两件事:

  • 正则表达式区分大小写。因此,您可以将-i传递给grep,也可以将额外的a-z添加到方括号表达式中
  • +修饰符和{}花括号似乎需要转义。

答案 1 :(得分:3)

如果您知道场位置,那么使用awk或cut会更容易:

awk -F ',' '{print $7}' file

OR

cut -d ',' -f7 file

答案 2 :(得分:1)

处理此问题的最佳方法是使用正确的CSV解析器。如果这是一次性任务,一种简单的方法是将CSV文件加载到您最喜欢的电子表格软件中,然后只提取电子邮件字段。

使用正则表达式解析CSV很困难,因为有可能转义逗号,引用文本等。

根据互联网标准,请考虑以下是有效的电子邮件地址:

  • FOO,酒吧@ gmail.com
  • foo“的bar@gmail.com

如果你知道一个事实,你将永远不会有这种数据,那么也许简单的grep和awk工具将起作用(如@ anubhava的答案)。

答案 3 :(得分:1)

您可以借助内置csv模块和外部validators模块,使用解决此问题,如下所示:

import validators
import csv
import sys

with open(sys.argv[1], newline='') as csvfile:
    csvreader = csv.reader(csvfile)
    for row in csvreader:
        for field in row:
            if validators.email(field):
                print(field)

像以下一样运行:

python3 script.py infile

产量:

cgreen@blah.com