从文本文件中提取电子邮件地址(SED?AWK?)

时间:2013-12-25 15:51:58

标签: sed awk

我有一个从Outlook收集的电子邮件地址文件,以便收集的表单中的地址显示如下:

-A@b.com
-C@d.com
-A@b.com,JOHN DOE, RICHARD ROE,"\O=USERS:SAM" 

我最终想要的是一个文本文件,每行有一个有效形成的地址。所以A@b.com可以,但是“RICHARD ROE”和“\ O = USERS等”。不会是。也许这可以用SED或AWK完成?

2 个答案:

答案 0 :(得分:2)

这是给出你发布的输入文件的GNU awk的一种方式:

$ gawk -v RS='[[:alnum:]_.]+@[[:alnum:]_]+[.][[:alnum:]]+' 'RT{print RT}' file
A@b.com
C@d.com
A@b.com

它只是找到简单的电子邮件地址,例如“bob@the_moon.net”或“Joe.Brown@google.com”,如果您可以找出适当的RE以捕获更多深奥的电子邮件地址或发布更具代表性的输入,请随时更改RS的设置文件,如果你有例子。这是另一个可以通过指定电子邮件地址中不能包含哪些字符而不是那些字符的RE:

$ gawk -v RS='[^[:space:][:punct:]]+@[^[:space:][:punct:]]+[.][^[:space:][:punct:]]+' 'RT{print RT}' file
A@b.com
C@d.com
A@b.com

同样适用于您发布的示例,但可能不适用于其他人。按摩适合...

使用其他awks,您可以通过设置FS或使用match()和循环来完成相同的操作。

答案 1 :(得分:0)

您可以尝试:

awk -F, '{
  for (i=1; i<=NF; i++)
    if ($i ~ /@/)
       print $i
}' file

或者像这样:

awk -F, -f e.awk file

其中e.awk是:

{
    for (i=1; i<=NF; i++)
        if ($i ~ /@/)
            print $i
}