← все скрипты

log-analyzer.sh

bash ~ 78 строк обновлён 20 марта 2026

Быстрый анализ access-логов nginx. Показывает топ IP-адресов, самые запрашиваемые URL, распределение кодов ответов и подозрительные паттерны (сканеры, брутфорс).

Зависимости

Использование

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 "=== Анализ завершён ==="