Итак, я взломал это вместе во время DDOS-атаки, чтобы вытащить непослушные ips из моих логов. У кого-нибудь есть какие-либо улучшения или другие предложения, чтобы сделать это лучше?
Вот общая идея:
- вытащить только ip из файла журнала
- сортировать их
- uniq и сосчитайте их
- сортировать их снова
И струнные трубы:
cut --delim " " -f7 /var/log/apache_access | sort | uniq -c | sort -rn > sorted-ips.txt
text-processing
logs
ip
Гейб.
источник
источник
Ответы:
Я всегда использовал это:
tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
Благодаря тому,
tail
что я могу установить предел того, насколько далеко я действительно хочу пойти - хорошо, если вы не используете ротацию журналов (по какой-либо причине), во-вторых, я используюawk
- так как большинство журналов разделены пробелом, я я оставил себе возможность извлекать дополнительную информацию (возможно, какие URL они использовали, статусы, браузеры и т. д.), добавляя соответствующую$
переменную. Наконец, недостаток вuniq
этом работает только в трогательных парах - IE:Будет производить:
Не желаемый вывод. Таким образом, мы сортируем первый столбец (в данном случае ips, но мы могли бы отсортировать другие столбцы), а затем
uniq
их, наконец, сортируем счетчик по возрастанию, чтобы я мог видеть самых обидчиков.источник
-k1
избыточен, (1) есть только один ключ (2)sort
начинает использовать первое слово в качестве ключа в любом случае.Похоже, вы находитесь в процессе переизобретения колеса fail2ban .
Посмотрите на fail2ban. Он, вероятно, уже делает то, что вы хотите, а если нет, то его легко настроить.
источник
Марко Чеппи прав в том,
awk
что он является лучшим инструментом для этого, но awk также является лучшим инструментом,sort
иuniq
с тех пор эту логику можно использоватьawk
. Это не имеет большого значения, если вы просто следите за 1000 строками, но если вы хотите посмотреть на огромный файл журнала с несколькими гигабайтами, его можно перенести на несколько порядков быстрееawk
.cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
будет делать то, что вам нужно, но намного быстрее для больших файлов. Он создает массив IP-адресов в awk, используя IP-адрес в качестве ключа и количество раз, которое IP-адреса встречаются в качестве значения.Ускорение происходит потому, что awk делает один проход по данным и выполняет большую часть работы, за исключением сортировки окончательного результата. Используя другой метод, если у вас есть 1 000 000 строк в журнале передачи, awk читает эти 1 000 000 строк, выплевывая 1 000 000 IP-адресов, а затем сортирует по всем 1 000 000 IP-адресам, отправляя теперь отсортированные 1 000 000 IP-адресов в uniq, что сокращает его до гораздо меньшего количество данных, прежде чем дать, чтобы отсортировать. Вместо того, чтобы обойти / сделать несколько проходов на 1 000 000 IP-адресов, awk делает почти все за один проход.
Используя 5 513 132 строки в Apache Log (1,1 гигабайта) на моем ноутбуке, вот сравнение скорости:
cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
источник