log-analyzer.sh
Быстрый анализ access-логов nginx. Показывает топ IP-адресов, самые запрашиваемые URL, распределение кодов ответов и подозрительные паттерны (сканеры, брутфорс).
Зависимости
awk,sort,uniq,head— стандартные утилиты
Использование
chmod +x log-analyzer.sh # Анализ стандартного лога nginx ./log-analyzer.sh /var/log/nginx/access.log # Вывод в файл ./log-analyzer.sh /var/log/nginx/access.log > report.txt # Только за сегодня (через grep) grep "$(date +%d/%b/%Y)" /var/log/nginx/access.log | ./log-analyzer.sh /dev/stdin
Код
#!/usr/bin/env bash
set -euo pipefail
# log-analyzer.sh — быстрый анализ access-логов nginx
# Формат: стандартный combined log
LOGFILE="${1:?Укажите путь к лог-файлу}"
TOP="${2:-10}"
if [ ! -f "$LOGFILE" ] && [ "$LOGFILE" != "/dev/stdin" ]; then
echo "Файл не найден: $LOGFILE" >&2
exit 1
fi
TOTAL=$(wc -l < "$LOGFILE")
echo "=== Анализ лога: $LOGFILE ==="
echo " Всего запросов: $TOTAL"
echo ""
# Топ IP-адресов
echo "--- Топ-$TOP IP-адресов ---"
awk '{print $1}' "$LOGFILE" | sort | uniq -c | sort -rn | head -n "$TOP" | \
awk '{printf " %7d %s\n", $1, $2}'
echo ""
# Топ URL
echo "--- Топ-$TOP запрашиваемых URL ---"
awk '{print $7}' "$LOGFILE" | sort | uniq -c | sort -rn | head -n "$TOP" | \
awk '{printf " %7d %s\n", $1, $2}'
echo ""
# Коды ответов
echo "--- Коды ответов ---"
awk '{print $9}' "$LOGFILE" | grep -E '^[0-9]{3}$' | sort | uniq -c | sort -rn | \
awk '{printf " %7d HTTP %s\n", $1, $2}'
echo ""
# Подозрительные паттерны
echo "--- Подозрительные запросы ---"
SUSPICIOUS=$(grep -ciE '(wp-login|xmlrpc|phpmyadmin|\.env|/admin|/config|\.git|shell|eval)' "$LOGFILE" || true)
echo " Сканеры/брутфорс: $SUSPICIOUS запросов"
ERRORS_4XX=$(awk '$9 ~ /^4[0-9]{2}$/' "$LOGFILE" | wc -l)
ERRORS_5XX=$(awk '$9 ~ /^5[0-9]{2}$/' "$LOGFILE" | wc -l)
echo " Ошибки 4xx: $ERRORS_4XX"
echo " Ошибки 5xx: $ERRORS_5XX"
echo ""
# Пиковые часы
echo "--- Распределение по часам ---"
awk -F'[/: ]' '{print $7}' "$LOGFILE" 2>/dev/null | sort | uniq -c | sort -rn | head -5 | \
awk '{printf " %7d запросов в %s:00\n", $1, $2}'
echo ""
echo "=== Анализ завершён ==="