Извлечение данных из журнала EXIM - PullRequest
0 голосов
/ 13 ноября 2018

У меня есть журнал в следующем формате

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

PS также мне нужно извлечь эти данные только за последние 6 часов в журнале EXIM, сделатьВы думаете, что это возможно?

Спасибо

1 Ответ

0 голосов
/ 14 ноября 2018

awk на помощь

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

Только если время журнала> = системное время - 6 часов

Редактировать

Чистое решение awk, предложенное @ tripleee

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
...