Originally Posted by
mkk
Дано:
Имеется файл, в котором записаны айпишники и названия узлов, например так:
Требуется:
Скрипт, который периодически просматривает системный лог и заменяет в нём эти айпишники на указанные названия из файла.
Скрипт планирую запускать через cron.
Если нужно, то структуру файла с названиями можно поменять.
Подскажите как сделать?
Или учите awk, или поставьте bash / perl / и т.д., и напишите для них.
Неэффективный, но рабочий и простой вариант:
Code:
#!/bin/sh
cat /path/to/my/host_file | while read a b ; do sed -i "s/$a/$a\[$b\]/" /path/to/log_file ; done
Где
/path/to/my/host_file - Ваш файл с парами(!! - без пробелов в имени!) "IP HOST",
/path/to/log_file - лог-файл, в котором будут меняться(!) все вхождения первого слова на конструкцию "первое_слово[второе_слово]", что позволит видеть как IP, так и имя (к слову, порядок можно и поменять).
Пример:
Файл /tmp/my_hosts
Code:
210.5.162.47 SPAMMER_BOT
После запуска
Code:
cat /tmp/my_hosts | while read a b ; do sed -i "s/$a/$a\[$b\]/" /tmp/syslog.log | done
в файле будут строки вида:
Code:
Jan 4 23:24:46 dropbear[267]: Child connection from ::ffff:210.5.162.47[SPAMMER_BOT]:60320
Недостатки:
1. Файл будет открываться для изменения столько раз, сколько строк в в Вашем файле соответствия IP<->Имя.
2. Нет совместимых блокировок, поэтому одновременная запись syslogd и sed может привести к повреждениям файла. Как выход - работать с _копией_ файла.