如何从文件中查找某些特定部分?

How to grep for some specific parts, from a file?

我需要从 'very big > 3GB' 文本文件中提取一些特定的部分。

,(1,'test@hotmail.com',0,0,1,1,0,0,1),
 (2,'test4@hotmail.com',1,0,3,1,7,0,1),
 (3,'test2@live.com',0,0,0,1,0,0,1),
 (4,'test5@hotmail.com',1,0,7,1,1,1,3),
 (5,'test3@hotmail.com',0,0,3,1,1,0,1),
 (6,'test6@hotmail.com',1,0,5,1,6,1,1),

我需要 'first field, email, third field' 所以(没有 '')并按如下行..

1,test@hotmail.com,0

2,test4@hotmail.com,1

3,test2@live.com,0

etc..

如果可能的话,我想提取域名(比如 1,test@hotmail.com,hotmail.com,0 )

我可以使用以下方法提取电子邮件:

grep -o -E '\b[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}\b' test

而且我尝试了更多... 像 egrep -o -E '([^),(^]+)' testset

希望有人能帮帮我!

您可以使用tr将很长的行拆分为多行。

然后使用tr删除特殊字符,如()

最后,使用 AWK 打印输出预期的列。

tr ")('" "\n " < file | tr -d "[ ]" |awk -F"," '{print ","","}'


更新

那么 split 电子邮件或主机名就可以解决您的问题。

tr ")" "\n" < file | tr -d "[ (']" |awk -F"," '{ split(, a, "@"); print ","","a[2]",";}'


最终更新

添加检查,只打印合法的行。

tr ")" "\n" < file | tr -d "[ (']" |awk -F"," '{ split(, a, "@"); if (NF>2) {print ","","a[2]",";}}'

输出

1,t@hotmail.com,hotmail.com,0
2,test4@hotmail.com,hotmail.com,1
3,test2@live.com,live.com,0