Você pode tentar esta expressão sed
:
sed -e 's/^\(.* .* \).* .*== \([^ ]* \).*MAIL FROM:<\([^ ]*\)> [^ ]* \([0-9 .]*\)\[.*Messages from \([^ ]*\).*$/\t\t\t\t/'
Funciona para mim com o seu exemplo.
Explicação
Esta expressão sed
contém apenas um comando - s/.../.../
.
Primeira parte de s///
:
'^\(.* .* \)' -- Timestamp, two first space-separated blocks of text, .
'.* .*== ' -- Uninteresting text after timestamp.
'\([^ ]* \)' -- Block of test between spaces, first email address, .
'.*MAIL FROM:<' -- Position before second email.
'\([^ ]*\)>' -- Second email addr, non-space characters, ended by '>', .
' [^ ]* ' -- SIZE=...:
'\([0-9 .]*\)\[' -- Error codes: digits, spaces and dots ended by '[', .
'.*Messages from ' -- Position before IP.
'\([^ ]*\)' -- Non-space characters, ended by space, IP. .
'.*$' -- Text before end of string, not interesting.
Como você pode ver, é apenas uma descrição direta dos registros brutos, não há nada interessante.
A segunda parte de s///
está colocando apenas \N
na ordem correta com \t
(caractere de tabulação) como separador.