Você estava no caminho certo para usar o awk. Você deve escrever um script que leia seus registros e produza os campos separados por tabulações¹. Em seguida, use o comando column para realinhar as colunas:
extract.awk²:
BEGIN {OFS="\t"; print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:"}
{print $1, $6, $7, $NF, $(NF-5)}
Em seguida, execute-o com este comando:
awk -f extract.awk logs | column -t -s '^I'
Em que '^I'
representa uma guia real entre aspas.
A única parte complicada era lidar com as mensagens de erro nos logs, o que poderia ser um número variável de palavras. Resolvi isso contando colunas da direita para os campos IP e código de erro.
Veja como ficou a saída:
Timestamp EmailTo: EmailFrom: IPAddress: ErrorCodes:
2016-06-19 [email protected] ([email protected]) 36.23.21.11 554-
2016-06-20 [email protected] ([email protected]) 36.23.21.14 554-
2016-06-20 [email protected] F=<[email protected]> 36.23.21.11 421
2016-06-20 [email protected] F=<[email protected]> 36.23.21.14 421
Eu posso ter adivinhado errado sobre as colunas de entrada desde que você não especificou qual era qual, e se você quiser limpar os endereços de e-mail na terceira coluna, você pode estar muito profundo para o awk, e é hora de pense em usar Python ou Perl.
Ou com o separador de saída de sua escolha, contanto que não esteja em nenhum dos dados. Então apenas use isso como o argumento -s
para column
.
² Como Kusalananda aponta, não há razão para um script awk ser escrito como one-liner. Aqui está a versão dele:
BEGIN {
OFS="\t";
print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:";
}
{
print $1, $6, $7, $NF, $(NF-5);
}
Quanto a mim, eu gosto de um one-liner.