我正在尝试从工作目录中的所有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
请帮帮我。谢谢!
答案 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
)