【问题描述】

从以下信息中提取联系人邮箱地址,内容如下:

<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>, 任翔 <xiang.ren@mm.com>, 李杨柳 <yangliu.li@mm.com>, 孟津 <jin.meng@mm.com>, 王立光 <liguang.wang@mm.com>

【解决办法】

1.awk

$awk '{for(i=1;i<=NF;i++) if($i ~ "<" ) {print gensub(/<(.+)>.*/,"\\1","g",$i)} }' a.txt 
yongbo.shan@mm.com
junqing.li@mm.com
xiang.ren@mm.com
yangliu.li@mm.com
jin.meng@mm.com
liguang.wang@mm.com
$awk '{for(i=1;i<=NF;i++) if($i ~ "<" ) {print $i} }' a.txt |awk -F '<|>' '{print $2}'
yongbo.shan@mm.com
junqing.li@mm.com
xiang.ren@mm.com
yangliu.li@mm.com
jin.meng@mm.com
liguang.wang@mm.com

2.sed与awk结合

$sed -r 's#,##g' a.txt |tr ">" "\n" |awk -F '<' '{print $NF}' |sed '/^\s*$/d'
yongbo.shan@mm.com
junqing.li@mm.com
xiang.ren@mm.com
yangliu.li@mm.com
jin.meng@mm.com
liguang.wang@mm.com

sed '/^\s*$/d'删除空行

3.grep

  • 法一:

$grep -oP '(?<=<)(.*?)(?=>)' a.txt 
yongbo.shan@mm.com
junqing.li@mm.com
xiang.ren@mm.com
yangliu.li@mm.com
jin.meng@mm.com
liguang.wang@mm.com
  • 法二

[root@test ~]# echo '<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>' |grep -oP '\b[^<]+(?=>)'              
yongbo.shan@mm.com
junqing.li@mm.com
  • 法三

[root@test ~]# echo '<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>' |grep -oP '(?<=<)[^>]+\b'
yongbo.shan@mm.com
junqing.li@mm.com

【附录】

  • 仅提取用户名

  • 法一

其中\b[\w|\.]+(?=@\b)匹配以@结尾的单词前面的大于一个的'单词字符(字母数字下划线)'或'.'的组合字符,显然不包括"<",这里匹配上的就是用户名,<yongbo.shan@mm.com>

[root@test ~]# echo '<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>' |grep -oP '\b[\w|\.]+(?=@\b)' 
yongbo.shan
junqing.li
  • 法二

[root@test ~]# echo '<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>' |grep -oP '[^<]+(?=@\b)'   
yongbo.shan
junqing.li
  • 法三

[root@test ~]# echo '<yongbo.shan@mm.com>, 李俊清 <junqing.li@mm.com>' |grep -oP '(?<=<)[^@]+\b'
yongbo.shan
junqing.li