Утилита grep: поиск IP-адресов и подсчет количества ошибок в логах
Зачем фильтровать логи с помощью grep?
Лог-файлы активных веб-серверов (например, access.log и error.log) могут содержать миллионы строк и весить десятки гигабайт. Открывать такие файлы в обычном текстовом редакторе бессмысленно — сервер просто зависнет из-за нехватки оперативной памяти. Утилита grep считывает поток данных построчно и мгновенно находит нужную информацию по ключевым словам или регулярным выражениям.
Шпаргалка по анализу логов утилитой grep
- Шаг 1. Поиск всех запросов с конкретного IP-адреса:
Найдем все действия подозрительного IP-адреса в журнале доступа веб-сервера:
grep "192.168.1.55" /var/log/nginx/access.log - Шаг 2. Быстрый подсчет количества запросов или ошибок (ключ -c):
Чтобы не выводить миллион строк на экран, а сразу узнать точное число совпадений, используйте флаг
-c(count):grep -c "192.168.1.55" /var/log/nginx/access.log - Шаг 3. Поиск ошибок без учета регистра (ключ -i):
Найдем записи со словами «error», «ERROR» или «Error»:
grep -i "error" /var/log/nginx/error.log - Шаг 4. Поиск строк, НЕ содержащих определенный текст (инверсия -v):
Отфильтруем полезные логи, исключив запросы к статическим картинкам и favicon:
grep -v "favicon.ico" /var/log/nginx/access.log | grep -v ".png" - Шаг 5. Вывод 5 строк контекста ДО и ПОСЛЕ найденной ошибки:
Чтобы понять, что именно привело к аварийному падению программы, выведем окружающий контекст:
grep -B 3 -A 5 "Fatal error" /var/log/php-fpm.log(Флаг
-B 3выводит 3 строки до ошибки, а-A 5— 5 строк после). - Шаг 6. Топ-10 самых активных IP-адресов в логе (связка grep + awk + sort):
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -nr | head -n 10
Частые вопросы (FAQ)
Как искать текст сразу во всех сжатых архивных логах (.gz)?
Используйте специальную утилиту zgrep. Она работает точно так же, как grep, но читает сжатые архивы на лету без предварительной распаковки: zgrep '192.168.1.55' /var/log/nginx/access.log.*.gz.
Как подсветить найденные совпадения цветом?
Добавьте флаг --color=auto, например: grep --color=auto 'POST' access.log.
Как искать ошибки во всех вложенных подпапках сразу?
Добавьте ключ рекурсивного поиска -r: grep -rn 'database connection failed' /var/log/.
Как вывести только уникальные найденные значения?
Передайте вывод grep по конвейеру в утилиты sort и uniq: grep 'Failed password' /var/log/auth.log | awk '{print $11}' | sort -u.