Вы были на правильном пути, применив awk. Вы должны написать скрипт, который читает ваши журналы и выводит их с полями, разделенными табуляцией¹. Затем используйте команду column, чтобы повторно выровнять столбцы:
extract.awk²:
BEGIN {OFS="\t"; print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:"}
{print $1, $6, $7, $NF, $(NF-5)}
Затем запустите его с помощью этой команды:
awk -f extract.awk logs | column -t -s '^I'
Где этот '^ I'
представляет собой фактическую вкладку в кавычках .
Единственная сложная часть заключалась в работе с сообщениями об ошибках в журналах, которые могли быть переменным количеством слов. Я решил это, подсчитав столбцы справа для полей IP и кода ошибки.
Вот как выглядел результат:
Timestamp EmailTo: EmailFrom: IPAddress: ErrorCodes:
2016-06-19 saadia@aol.com (fahad@manakintextiles.com) 36.23.21.11 554-
2016-06-20 saadia@aol.com (ranasohail@makintextiles.com) 36.23.21.14 554-
2016-06-20 otck@aol.com F=<info@alhadeed.com> 36.23.21.11 421
2016-06-20 awaq313@aol.com F=<anno@tekstilworks.co.uk> 36.23.21.14 421
Возможно, я неправильно догадался о входных столбцах, поскольку вы не указали, какие из них были, и если вы хотите очистить адреса электронной почты в третьем столбце, вы можете быть слишком глубоко для awk, и пора подумать об использовании Python или Perl.
¹ или с разделителем вывода по вашему выбору, если он не будет ни в одном из данных. Затем просто используйте это как аргумент -s
для столбца
.
²Как указывает @Kusalananda, нет смысла писать awk-скрипт как однострочник. Вот его версия:
BEGIN {
OFS="\t";
print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:";
}
{
print $1, $6, $7, $NF, $(NF-5);
}
Мне нравится однострочник.