使用Linux从工作目录中的所有csv文件中提取所有电子邮件地址

时间:2015-10-08 22:50:42

标签: linux csv sed grep

我正在尝试从工作目录中的所有csv文件中查找所有电子邮件地址,并将它们打印到\ n分隔符文本文件中。我试过了:

egrep -o '.*@.*' *.csv > alltheemails.txt

但是,这似乎占据了整条线。

然后,我试过了:

egrep -o ',.*@.*,' csv/*.csv > alltheemails.txt

我试图只复制电子邮件地址,也许是分隔符,后者可以更改。这也复制了整行。

然后,我试过了:

egrep -o ',.*@.*,' csv/*.csv | sed -e 's/^,...@//g' | tee alltheemails.txt

这仍然捕获了电子邮件前面的所有内容。我试过了:

egrep -o ',.*@.*,' csv/*.csv | sed -e 's/*^,.*@//g' | tee alltheemails.txt

还有许多其他变体,包括:

sed -e 's/.*^[[a-zA-Z0-9]*\.\_\-\+\*@[[a-zA-Z0-9]-\.]*\.[a-zA-Z0-9]{3}$]/.*^[[a-zA-Z0-9]*\.\_\-\+\*@[[a-zA-Z0-9]-\.]*\.[a-zA-Z0-9]{3}$/g' csv/*.csv | egrep -eo | tee alltheemails.txt

这产生了:

firstname,surname,lead,ip,address,city,state,postal,phone,date,range,daytime,interest,sex,dob,worktime,profit_estim,extra2

请帮帮我。谢谢!

4 个答案:

答案 0 :(得分:1)

当前目录中所有.csv文件的Perl解决方案
电子邮件地址可以在任何字段中

perl -lne 'print $1 if /([^,@"]+@[^,@"]+)/' *.csv > alltheemails.txt

打印匹配$1
从正则表达式/([^,@"]+@[^,@"]+)/
[^,@"]+ =除了@"

之外的任何字符的一次或多次出现

输入:

name,surname"user1@dom.com,address
name,surname,nomail,address2
nam,test,user2@dom.com"new york, central park
al,ternative,name11@mail.com,paris
alternative,name11@mail.com,paris

输出:

user1@dom.com
user2@dom.com
name11@mail.com
name11@mail.com

如果您更喜欢awk:

awk '{if (match($0, /[^,@"]+@[^,@"]+/, m)) print m[0]}' *.csv > alltheemails.txt

答案 1 :(得分:1)

使用grep -o,您需要提供一个仅与您实际要提取的文本匹配的正则表达式。

grep -Eo '[^,"@]*@[^,"@]*' csv/*.csv

-E选项在这里并不实用;但它是无害的。如果你想在你的正则表达式中使用一些ERE功能,那么它就很重要。)

答案 2 :(得分:0)

从这些csv开始:

~$ more *.csv 
::::::::::::::
email2.csv
::::::::::::::
mail@new.com,address,surname
test,noreply@com.com,new york, central park
ternative,aaaaaaaaa@b.com,paris
name,surname,nomail,address2
::::::::::::::
email.csv
::::::::::::::
user1@dom.com,address,name,surname
name,surname,nomail,address2
test,user2@dom.com,new york, central park
al,ternative,name11@mail.com,paris

编辑:一个python解决方案(代码包含-c选项,请参阅bash中的man python关于此内容:

python -c '
import sys

# needed to handle the bash argument, eg. the csv name
# skip first argument, it's the option "-c" itself
csvfile = str(sys.argv[1:][0])  
email_list = []

with open(csvfile) as f:
    for X in f:
        # field delimiter
        s = X.split(",")    
        for Z in s:
            # find the email address using "@"
            if "@" in Z:    
                email_list.append(Z)
for I in email_list:
    print I
' <(cat *.csv) > alltheemails.txt

你应该以这种方式使用bash的这个python代码:python -c 'code between single quotes' <(cat *.csv) > alltheemails.txt。 bash命令<(cat *.csv)cat *.csv输出与重定向组合在一起以创建python进程输入。

当然,您可以使用代码删除评论。如果您愿意,也可以将此代码放在脚本中以这种方式执行:python grep.py <(cat *.csv)。 输出:

mail@new.com
noreply@com.com
aaaaaaaaa@b.com
user1@dom.com
user2@dom.com
name11@mail.com

答案 3 :(得分:0)

sed -e '/@/!d' -e 's/.*/,&,/;s/[[:space:]]//g;s/,[^@,]*,/,/g;s/,\(.*\),/\1/' csv/*csv

将提取每行csv文件的所有电子邮件(如果存在)。结果是由,

分隔的行的电子邮件

如果逐行1,则添加;s/,/\n/g(对于GNU sed,对于posix版本,添加一个真正的新行而不是n