Нужно получить все ip-адреса, которые имеются в access.log. Должна быть возможность считать кол-во ip-адресов, т.е. вывести количество уникальных ip.
Для чего это может быть нужным? Например, если api-сервер переезжает на новый адрес. На старый сервер по-прежнему приходят какие-то http-запросы. Нам нужно найти и вычленить все ip, которые до сих пор стучатся.
Решение задачи.
Берём linux консоль в руки и получаем все уникальные ip адреса из лога:
less /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq
Разберём подробно:
- less — утилита для вывода содержимого файла /var/log/nginx/access.log. Указываем путь до нужного access-лога.
- cut -d’ ‘ -f1 — разбиваем строку на подстроки разделителем «пробел». Разделитель указывается флагом -d. Флагом -f указываем порядковый номер поля, которое будет отображаться в выводе. В данном случае «1» — первое поле, это и есть ip-адресс.
- sort — сортировка строк по порядку. Команда сгруппирует одинаковые строки «рядом». Команда sort необходима для корректной работы следующей команды — uniq.
- 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
Выведет лог в таком же виде:
- количество использований ip
- ip-адресс
Но, такой вариант с поиском ip по регулярному выражению формата ipv4 будет более затратным по вычислительным и временным ресурсам.
Источник статьи — jeka.by