Парсинг файлов журнала для частого IP

Если Вы собираетесь быть выполнением большого администрирования командной строки, Вы могли бы найти полезным проверить страницы справочника для usermod (8), chfn (1), chsh (1), passwd (1), склеп (3), gpasswd (8), groupadd (8),

12
21.03.2011, 02:17
3 ответа

Я всегда использовал это:

tail -1000 /var/log/apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1

С tail Я могу установить предел того, как далеко назад я действительно хочу пойти - хороший, если Вы не используете журнал, вращаются (по любой причине), второй, я использую awk - так как большинство журналов является пространством, разграниченным, я оставил мой сам со способностью вытащить дополнительную информацию (возможно, какие URL они поражали, состояния, браузеры, и т.д.) путем добавления соответствующего $ переменная. Наконец дефект в uniq это только работает в касающихся парах - IE:

A
A
A
A
B
A
A

Произведет:

4 A
1 B
2 A

Не желаемый вывод. Таким образом, мы сортируем первый столбец (в этом случае дюйм/с, но мы могли отсортировать другие столбцы), затем uniq их, наконец отсортируйте количество, возрастающее, таким образом, я вижу самых высоких преступников.

7
27.01.2020, 19:55
  • 1
    Да, я понял проблему с uniq также, следовательно мой первый вид для приведения в порядок всего IPS так, чтобы дубликаты были друг рядом с другом. Подсказка по хвосту хороша, также начиная с парсинга целого журнала на уровне приблизительно 4 ГБ может занять время. Хороший материал, спасибо. –  gabe. 13.08.2010, 16:54
  • 2
    -k1 избыточно, (1) существует всего один ключ (2) sort начинает использовать первое слово в качестве ключа так или иначе. –  Lekensteyn 05.05.2013, 11:23

Это кажется, что Вы посреди переосмысления fail2ban колеса.

Посмотрите на fail2ban. Это, вероятно, делает то, что Вы уже хотите, и в противном случае легко настроить.

7
27.01.2020, 19:55
  • 1
    Это - довольно интересный проект, о котором я не знал, спасибо. В то же время я не хочу устанавливать что-либо на лог-сервере, который не должен, и достаточно легко сделать то, что я уже делаю. Я просто ищу предложения на улучшениях.Спасибо! –  gabe. 12.08.2010, 22:39
  • 2
    Это выглядит действительно прохладным, и GPL также. –  Eli Frey 12.08.2010, 22:50

Marco Ceppi прав относительно awk быть лучшим инструментом для этого, но awk является также лучшим инструментом, чем sort и uniq так как та логика может быть перемещена в к awk. Это не имеет большую часть значения, если Вы просто выслеживаете 1 000 строк, но если Вы хотите посмотреть на огромный много файл журнала концерта, это могут быть порядки величины быстрее для перемещения этого в к awk.

cat /var/log/apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n сделает то, в чем Вы нуждаетесь, но намного быстрее для больших файлов. Это создает массив дюйм/с в awk, с помощью IP-адреса в качестве ключа и количества раз, дюйм/с происходит как значение.

Скорость прибывает, потому что awk делает каждый передает по данным, и делает большую часть работы, за исключением сортировки окончательного результата. Используя другой метод, если у Вас есть 1 000 000 строк в журнале передачи, awk читает те 1 000 000 строк, выкладывающих 1 000 000 дюйм/с, затем вид пробегается через все 1 000 000 дюйм/с, отправляя теперь отсортированные 1 000 000 дюйм/с в uniq, который уменьшает его вниз до намного меньшего объема данных прежде, чем дать это виду. Вместо того, чтобы передать по каналу вокруг/делающий нескольких передает 1 000 000 дюйм/с, awk делает почти все в одной передаче.

Используя 5 513 132 апачских журнала строки (1,1 концерта) на моем ноутбуке, вот сравнение скорости:

  • 45 на 2 м cat ./apache_access | awk '{print $1}' | sort -nk1 | uniq -c | sort -nk1
  • 40-е 0m cat ./apache_access | awk '{freq[$1]++} END {for (x in freq) {print freq[x], x}}' | sort -n
7
27.01.2020, 19:55
  • 1
    Очень прохладный. Я добавляю это к своему набору хитрых приемов. –  gabe. 27.06.2011, 17:26

Теги

Похожие вопросы