inotifywait -r -m -e modify /var/log/syslog | while read path _ file; do
grep -E -o "([0-9]{1,3}[.]){3}[0-9]{1,3}" /var/log/syslog |
sort | uniq | ??????
Вы повторно сканируете все значение /var/log/syslog
каждый раз, когда оно изменяется.O (N²) сильно вас укусит.
Выключите tail -f /var/log/syslog
при запуске и при попытках создания inotifywait, или, если вы используете systemd, вы можете просто сделать один journalctl -f
.передать вывод через, например, этот lex:
%option main nodefault
IPBYTE [0-9]|[1-9][0-9]|1[0-9][0-9]|2[0-4][0-9]|25[0-5]
%%
{IPBYTE}("."{IPBYTE}){3} puts(yytext);
[0-9.]+
[^0-9]{0,8192}
, чтобы извлечь все адреса ipv4, передать результаты через один
awk 'ARGIND==1 { seen[$0]++ } !seen[$0]++' known.ips - >> known.ips
, чтобы добавить только ранее невидимые адреса.
То есть, когда systemd догоняет с момента загрузки и остается в актуальном состоянии, это
(journalctl -b; journalctl -f) | extractip4s | that.awk known.ips - >>known.ips
, в противном случае замену journalctl на хвост -f и создание цикла inotifywait -me, запускающего больше, в подоболочке.