打印第一列并使用awk或sed发送电子邮件



在以下情况下如何使用AWK?

示例输入:

17  mary@mysite.co.uk
9   Limited <office@domain.com>
8  "Fishing Forum" <dra.78@gmail.com>

期望输出:

17  mary@mysite.co.uk
9   office@domain.com
8   dra.78@gmail.com

我想打印1美元,每行都有电子邮件地址。

为了处理所有可能的电子邮件选项(请参阅三元组注释(,您需要将电子邮件与regexp:进行匹配

gawk --re-interval '{match($0,/[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+.[A-Z]{2,4}/);print $1 " " substr($0,RSTART,RLENGTH)}'

它从这里获取的regexp:http://www.regular-expressions.info/email.html.您应该对其进行测试,以验证它是否涵盖所有合法电子邮件。

如果你的数据真的像你展示的那样简单,你可以使用awk sub()函数来获得你不想要的东西,即

 awk '{
      # inside the implied awk process-all-lines-of-input-loop
      email=$0
      if (email ~ /<.*>/) {
        sub(/^.*</,"", email)
        sub(/>.*$/,"", email)
      } 
      else { email=$2 }
      printf("%st%sn", $1, email)
      }' mailFile > newMailFile
cat newMailFile
17      17  mary@mysite.co.uk
9       office@domain.com
8       dra.78@gmail.com

请注意,我们已经将整行($0(复制到变量email中,然后删除从左边开始的所有字符,直到第一个<字符,然后删除email变量末尾以结束的>字符开始的任何字符。请注意,在角落案例中解析电子邮件地址可能相当复杂,因此这种技术可能会漏掉一些案例,但考虑到它的简单性,它应该足够好了。

此外,如果你不习惯awk和shell编程,请注意,你不能用相同的输出文件名覆盖你的输入文件"不要尝试类似awk '....' file > file的东西。它基本上会清除file

printf是打印数据的一种奇特方式,t在两个字段之间提供了一个制表符。你也可以用print $1 "t" email做得更简单。

IHTH。

$ cat stack 
17  mary@mysite.co.uk
9   Limited <office@domain.com>
8  "Fishing Forum" <dra.78@gmail.com>
$ cat stack | awk '{ print $1" "$NF }' | sed 's/<//g; s/>//g'
17 mary@mysite.co.uk
9 office@domain.com
8 dra.78@gmail.com

如果您希望在输出的第一列之间有一个tab,请使用以下方法:

$ cat stack | awk '{ print $1"t"$NF }' | sed 's/<//g; s/>//g'
17  mary@mysite.co.uk
9   office@domain.com
8   dra.78@gmail.com

如果您只需要电子邮件地址:

$ cat stack | awk '{ print $NF }' | sed 's/<//g; s/>//g'
mary@mysite.co.uk
office@domain.com
dra.78@gmail.com

FYI:NF为您提供一行中的字段总数

您可以将"sed"用于

$ ./test.sh | sed -r -e 's/<//g' -e 's/>//g' -e 's/^([0-9]+).* (.+)$/1 2/'
17 mary@mysite.co.uk
9 office@domain.com
8 dra.78@gmail.com