Я застрял и ищу помощи. Я хочу, чтобы вызвать событие, которое я хотел бы обработать через скрипт bash. Данные извлекаются из файла журнала. Прежде чем я начну объяснять, я покажу вам несколько строк этого конкретного файла журнала для лучшего понимания.
На что это похоже
test.log
[...] 24/04/2017 20:14:29 [ 7910] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:14:34 [10355] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:14:38 [10355] [INFO] [bob] Processed '1' incoming changes 24/04/2017 20:14:47 [22518] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:14:50 [ 7910] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:14:53 [ 7910] [INFO] [bob] Processed '1' incoming changes 24/04/2017 20:15:08 [10355] [INFO] [bob] method='POST' from='192.168.0.151' getUser='bob' some other colums 24/04/2017 20:15:14 [22518] [INFO] [bob] method='POST' from='192.168.0.151' cmd='Search' getUser='bob' some other colums 24/04/2017 20:15:15 [ 7910] [INFO] [bob] method='POST' from='192.168.0.151' getUser='bob' some other colums 24/04/2017 20:15:16 [10355] [INFO] [bob] method='POST' from='192.168.0.151' cmd='Search' getUser='bob' some other colums 24/04/2017 20:15:49 [32637] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:15:53 [22518] [INFO] [bob] method='POST' from='192.168.0.163' getUser='bob' some other colums 24/04/2017 20:15:56 [22518] [INFO] [bob] Processed '1' incoming changes 24/04/2017 20:16:05 [10355] [INFO] [bob] method='POST' from='192.168.0.151' getUser='bob' some other colums 24/04/2017 20:16:09 [32637] [INFO] [bob] method='POST' from='192.168.0.151' getUser='bob' some other colums 01/05/2017 03:27:45 [ 4985] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 01/05/2017 03:27:49 [13971] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 01/05/2017 03:28:05 [13970] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 01/05/2017 03:28:10 [ 4985] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 01/05/2017 03:28:25 [13971] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 01/05/2017 03:28:31 [13970] [INFO] [alice] method='POST' from='192.168.0.153' getUser='alice' some other colums 15/03/2018 14:49:19 [12918] [INFO] [alice] method='POST' from='192.168.0.171' getUser='alice' some other colums 15/03/2018 14:49:21 [12834] [INFO] [alice] method='POST' from='192.168.0.171' getUser='alice' some other colums 15/03/2018 14:49:22 [12834] [INFO] [alice] SyncCollections->CheckForChanges(): Waiting for store changes... (lifetime 470 seconds) 15/03/2018 14:55:26 [12843] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:26 [12918] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:26 [12882] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:27 [12970] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:28 [12882] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:28 [12918] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:32 [12970] [INFO] [bob] method='POST' from='192.168.0.166' getUser='bob' some other colums 15/03/2018 14:55:32 [12970] [INFO] [bob] SyncCollections->CheckForChanges(): Waiting for store changes... (lifetime 470 seconds) [...]
Цель
Я заинтересован в получении имени пользователя (в данном примере "Алиса" или "Боб") из файла журнала, который отображается в 5-м столбце, и соответствующего IP-адреса, который указан в 7-м столбце. В случае, если IP-адрес отличается от последнего состояния, уведомление по электронной почте должно быть отправлено с помощью небольшого bash-скрипта.
Условие должно быть:
- если строка содержит "alice" ИЛИ "bob" И строка содержит «from =», выведите имя пользователя и соответствующий IP-адрес.
Конечный результат должен выглядеть
bob 192.168.0.166 alice 192.168.0.171
Примечание. Требуется только последний известный IP-адрес, поэтому в этом примере выходные данные должны генерировать только 2 строки, как показано выше (по одной для каждого пользователя).
Что я пробовал до сих пор
Я начал с awk, но быстро столкнулся с препятствием, потому что awk по умолчанию использует пробел в качестве разделителя полей. Я хотел начать с заявления {print $ 4, $ 6}. Я понял, что третий столбец иногда нарушает эту фильтрацию из-за пробела в id процесса, например
24/04/2017 20:14:50 [ 7910] ...
Как выглядит моя команда awk в данный момент
С помощью следующей команды я ищу строку "alice" ИЛИ "bob" И строку «from =», а затем генерирую вывод из двух неотформатированных столбцов
awk 'BEGIN { FS = "[?!([ )]+" } /alice|bob/ && /from=/ { print $5,$7 }' test.log
Выход ->
bob] from='192.168.0.163' bob] from='192.168.0.163' bob] from='192.168.0.163' bob] from='192.168.0.163' bob] from='192.168.0.151' bob] from='192.168.0.151' bob] from='192.168.0.151' bob] from='192.168.0.151' bob] from='192.168.0.163' bob] from='192.168.0.163' bob] from='192.168.0.151' bob] from='192.168.0.151' alice] from='192.168.0.153' alice] from='192.168.0.153' alice] from='192.168.0.153' alice] from='192.168.0.153' alice] from='192.168.0.153' alice] from='192.168.0.153' alice] from='192.168.0.171' alice] from='192.168.0.171' bob] from='192.168.0.166' bob] from='192.168.0.166' bob] from='192.168.0.166' bob] from='192.168.0.166' bob] from='192.168.0.166' bob] from='192.168.0.166' bob] from='192.168.0.166'
Я застрял здесь. Я попытался поиграть, сохранив последнюю известную строку в переменной, и вывел «{a = $ 0}», но, очевидно, я делаю что-то не так, потому что получаю либо ошибки, либо вывод неправильный. Моей следующей идеей было использовать "tac" и начать читать лог-файл с его конца и выйти после первого совпадения. Что-то вроде того:
tac test.txt | awk 'BEGIN { FS = "[?!([ )]+" } /alice|bob/ && /from=/ { print $5,$7; exit }'
но это сразу останавливается после 1-го матча и выводится:
bob] from='192.168.0.166'
Мне нужно дополнительно форматировать вывод, убрав правую скобку ']' и строку 'from =' и одинарные кавычки вокруг IP-адреса.
Любая помощь действительно ценится. Заранее спасибо.