Получить список ip-адресов из лог-файла

Нужно получить все ip-адреса, которые имеются в access.log. Должна быть возможность считать кол-во ip-адресов, т.е. вывести количество уникальных ip.

Для чего это может быть нужным? Например, если api-сервер переезжает на новый адрес. На старый сервер по-прежнему приходят какие-то http-запросы. Нам нужно найти и вычленить все ip, которые до сих пор стучатся.

Решение задачи. 

Берём linux консоль в руки и получаем все уникальные ip адреса из лога:

less /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq

Разберём подробно:

  1. less — утилита для вывода содержимого файла /var/log/nginx/access.log. Указываем путь до нужного access-лога.
  2. cut -d’ ‘ -f1 — разбиваем строку на подстроки разделителем «пробел». Разделитель указывается флагом -d. Флагом -f указываем порядковый номер поля, которое будет отображаться в выводе. В данном случае «1» — первое поле, это и есть ip-адресс.
  3. sort  — сортировка строк по порядку. Команда сгруппирует одинаковые строки «рядом». Команда sort необходима для корректной работы следующей команды — uniq.
  4. uniq— выведет только уникальные строки. Т.е. в результате будут только уникальные ip-адреса.

Улучшим команду, добавив вывод количества ip-адресов. Для вывода количества, нужно добавить флаг  (от слова count) к команде uniq:

less /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq -c

Результат работы команды будет в таком виде, сначала количество использований ip, затем сам ip.

Есть другой вариант с помощью регулярных выражений:

sed -e 's/([0-9]+.[0-9]+.[0-9]+.[0-9]+).*$/1/' -e t -e d access.log | sort | uniq -c

Выведет лог в таком же виде:

  1. количество использований ip
  2. ip-адресс

Но, такой вариант с поиском ip по регулярному выражению формата ipv4 будет более затратным по вычислительным и временным ресурсам.

Источник статьи — jeka.by