【问题描述】

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

, 李俊清 
, 任翔 
, 李杨柳 
, 孟津 
, 王立光 

【解决办法】

1.awk

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

2.sed与awk结合

$sed -r 's#,##g' a.txt |tr ">" "\n" |awk -F '<' '{print $NF}' |sed '/^\s*$/d'yongbo.shan@mm.comjunqing.li@mm.comxiang.ren@mm.comyangliu.li@mm.comjin.meng@mm.comliguang.wang@mm.com

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

3.grep

  • 法一:

$grep -oP '(?<=<)(.*?)(?=>)' a.txt yongbo.shan@mm.comjunqing.li@mm.comxiang.ren@mm.comyangliu.li@mm.comjin.meng@mm.comliguang.wang@mm.com
  • 法二

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

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

【附录】

  • 仅提取用户名

  • 法一

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

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

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

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