在以下情况下如何使用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