如何使用grep从日志中提取电子邮件

时间:2016-09-05 10:36:07

标签: grep

我有超过一百个日志文件,在每个文件中,我有0到20行,格式如下:

  

[2016-06-08 18:12:32] production.INFO:成功完成了一些事情。电子邮件:foo@bar.com []   {"使用者":"匿名"" URL":" /东西"" IP":&#34 ; 77.46.189.212"" http_method":" POST""服务器":" www.mysite.com",& #34;引荐":" www.mysite.com/something"," UNIQUE_ID":" V1hD7lJ10JkAAAQ7MgsAAAAa"}

如何使用grep从这些文件中提取所有电子邮件,但只取出电子邮件前面的那些行Successfully done something. Email:

换句话说,应该忽略来自下一行的电子邮件:

  

[2016-06-08 17:13:29] production.INFO:用户another@email.com登录   出...... []   {"用户":" another@email.com"," URL":" /管理/注销"" IP&# 34;:" 109.92.131.202"" http_method":" GET""服务器":" mysite.com&# 34;,"引荐":" www.mysite.com/admin/foo"," UNIQUE_ID":" V1g2GVJ10JkAAAqy42gAAABH"}

从给定示例中,我想提取foo@bar.com并忽略another@email.com

2 个答案:

答案 0 :(得分:0)

如果您的grep版本支持perl正则表达式,那么您可以尝试类似的东西

grep -r 'Successfully done something. Email:' /path/to/logs/ | grep -oP '\S+@\S+'

您可能希望将第二个grep中的正则表达式替换为更好的正则表达式。

您也可以使用单个grep

grep -roP 'Successfully done something. Email: \K\S+@\S+' /path/to/logs/'

答案 1 :(得分:0)

您可以使用awk检查“成功完成某项操作”。行发生,它还包含一封电子邮件:

awk '/Successfully done something. Email:/ && \  # match line
     match($0, /Email: ([^ ]*) /, matches) {     # match up to space
         print matches[1]                        # print captured group
     }' file

根据您提供的数据:

$ awk '/Successfully done something. Email:/ && match($0, /Email: ([^ ]*) /, matches) {print matches[1]}' file
foo@bar.com