Извлечение из журналов

Фактические журналы:

2016-06-19 22:08:09 [213917] 1bEgCe-000tZR-E9 ** saadia@aol.com (fahad@manakintextiles.com) <fahad@manakintextiles.com> F=<james@designplus.com> P=<james@designplus.com> R=lookuphost T=remote_smtp H=mailin-01.mx.aol.com [64.12.88.131]:25 I=[36.23.21.11]:60147: SMTP error from remote mail server after initial connection: 554- (RTR:BL) https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.11 2016-06-20 01:03:22 [516458] 1bEiwD-001zt7-IY ** saadia@aol.com (ranasohail@makintextiles.com) <ranasohail@makintextiles.com> F=<james@kansaifelt.com> P=<james@kansaifelt.com> R=lookuphost T=remote_smtp H=mailin-02.mx.aol.com [64.12.88.163]:25 I=[36.23.21.14]:47630: SMTP error from remote mail server after initial connection: 554- (RTR:BL) https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.14 2016-06-20 09:29:46 [256975] 1bEqpT-0014jI-HV ** otck@aol.com F=<info@alhadeed.com> P=<info@alhadeed.com> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-04.mx.aol.com [64.12.88.132]:25 I=[36.23.21.11]:43705: SMTP error from remote mail server after initial connection: 421 DYN:T2 https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.11 2016-06-20 11:41:34 [413114] 1bEstm-001jSC-Ic ** awaq313@aol.com F=<anno@tekstilworks.co.uk> P=<anno@tekstilworks.co.uk> R=dkim_lookuphost T=dkim_remote_smtp H=mailin-02.mx.aol.com [64.12.91.195]:25 I=[36.23.21.14]:48714: SMTP error from remote mail server after initial connection: 421 DYN:T1 https://postmaster.aol.com/error-codes#554rtrbl\n554 Connecting IP: 36.23.21.14 

Что я хочу получить:

  • Как проверить, присутствует ли какой-либо IP-адрес в файле с использованием сценариев оболочки?
  • Заполнение табуляции внутри циклов, не работающих
  • Почему я не могу применить этот скрипт к файлам не в моем текущем каталоге?
  • Bash Scripting: Как ограничить количество опций в цикле выбора?
  • Использование подстановочных знаков для соответствия директории в bash
  • Как скопировать между двумя удаленными узлами, используя tar, переданные в SSH с удаленного сервера, когда за брандмауэром?
  •  Timestamp EmailTo: EmailFrom: IPAddress: ErrorCodes: 2016-06-19 saadia@aol.com james@designplus.com 36.23.21.11 554- (RTR:BL) 2016-06-20 saadia@aol.com james@kansaifelt.com 36.23.21.14 554- (RTR:BL) 2016-06-20 otck@aol.com info@alhadeed.com 36.23.21.11 421 DYN:T2 2016-06-20 awaq313@aol.com anno@tekstilworks.co.uk 36.23.21.14 421 DYN:T1 

    Я извлекаю первые три поля из следующей команды:

      echo -e "Timestamp\t\tEmailTo:\t\tEmailFrom:\t\t\t\t\t\t\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; printf "%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4) ;} ' logs | column -t 

    Спасибо всем, но я сделал это через:

      echo -e "Timestamp:\tEmailTo:\tEmailFrom:\t\tIPAddress:\tErrorCodes:" && awk 'NF>6 { d=6 ; while ( ! ($d ~ /^F=/ ) ) d++ ; print "%s\t%s\t%s\t%s\t%s\t%s\n",$1,$6,substr($d,4,length($d)-4),$NF,$(NF-5)$(NF-4) ; }' oops | column -t| grep -v "%s" 

  • Как правильно настроить PS1?
  • команда pure bash с sudo
  • Как назначить переменные среды параллельно в bash
  • Как запустить интерактивные команды, как другого пользователя
  • Почему расширение оболочки на popd не удаляет каталог из стека?
  • Код рефакторинга с использованием sed
  • One Solution collect form web for “Извлечение из журналов”

    Вы были на правильном пути, чтобы использовать 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.


    ¹or с разделителем вывода по вашему выбору, если он не будет ни в одной из данных. Тогда просто используйте это как аргумент -s для column .

    ² Как поясняет @ Kusalananda, нет никаких оснований для написания awk-скрипта как однострочного. Вот его версия:

     BEGIN { OFS="\t"; print "Timestamp\tEmailTo:\tEmailFrom:\tIPAddress:\tErrorCodes:"; } { print $1, $6, $7, $NF, $(NF-5); } 

    Что касается меня, мне нравится один лайнер.

    Linux и Unix - лучшая ОС в мире.