Постановка задачи:
Нужно получить все ip-адреса, которые имеются в access.log. Вывести списком ip адреса и кол-во запросов с каждого IP
Для чего это может быть нужным? Например, если api-сервер переезжает на новый адрес. На старый сервер по-прежнему приходят какие-то http-запросы. Нам нужно найти и вычленить все ip, которые до сих пор стучатся.
Решение задачи вариант 1
Берём 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-адресс. Если в ваше логе IP идет вторым, то-f2
-
sort
— сортировка строк по порядку. Команда сгруппирует одинаковые строки "рядом". Команда sort необходима для корректной работы следующей команды -uniq
. -
uniq
— выведет только уникальные строки. Т.е. в результате будут только уникальные ip-адреса.
Улучшим команду, добавив вывод количества ip-адресов. Для вывода количества, нужно добавить флаг -с
(от слова count) к команде uniq
:
less /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq -c
Результат работы команды будет в таком виде, сначала количество использований ip, затем сам ip:
less /var/log/nginx/access.log | cut -d' ' -f1 | sort | uniq -c 7 155.55.55.55 1005000 155.55.55.56 520 155.44.44.44 955 155.33.33.33
Решение вариант 2:
Получить все 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 будет более затратным по вычислительным и временным ресурсам.