从EXIM日志中提取数据

时间:2018-11-13 17:14:19

标签: file logging sed grep exim

我以以下格式登录

2018-11-11 06:02:32 1gLkhU-002yf9-3G <= email@domain.com H=(netserver.br - 2.15.2.2 -) [127.0.0.1]:48270 P=esmtpsa X=TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256 CV=no A=dovecot_plain:my@dom.com S=3209 T="test" for my@gmail.com

我需要从上面的行示例中仅提取并完全采用这种格式

email@domain.com my@dom.com

注意:dovecot_plain:有时只能是一个用户名(而不是完整的电子邮件)

我正在使用这个

grep "dovecot_plain:" /var/log/exim_mainlog | egrep -a -E -io " [A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4} | A=dovecot_plain:[A-Z0-9.@_%+-]{1,100}" 

但是它不能按我的需要工作,因为它返回了这个

 email@domain.com 
 A=dovecot_plain:my@dom.com

分两行...

有什么想法要完全以这种格式提取吗?

email@domain.com my@dom.com

p.s。我也只需要在EXIM日志中提取最近6个小时的数据,您认为有可能吗?

谢谢

1 个答案:

答案 0 :(得分:1)

求助

grep "dovecot_plain:" /var/log/exim_mainlog | awk 'BEGIN{min_timestamp=systime() - 6*60*60}{datetime=$1 " " $2; gsub(/-|:/," ", datetime); timestamp=mktime(datetime)}timestamp>=min_timestamp{split($14,s,":"); print $5, s[2]}'

返回

email@domain.com my@dom.com

仅当日志时间> = systime-6小时

修改

@tripleee建议的纯awk解决方案

awk 'BEGIN{min_timestamp=systime() - 6*60*60}/dovecot_plain:/{datetime=$1 " " $2; gsub(/-|:/," ", datetime); timestamp=mktime(datetime) ; if(timestamp>=min_timestamp){split($14,s,":"); print $5, s[2]}}' /var/log/exim_mainlog