
Ниже — набор практичных терминальных команд и one‑liner’ов для быстрого анализа access‑логов (Apache/Nginx, Common/Combined). Команды даю с кратким пояснением — запускайте их на файлах журналов. Помните про права доступа к логам и не выкладывайте их в публичные каналы.
Базовые: посмотреть последние строки / следить в реальном времени
# последние 200 строк tail -n 200 /var/log/nginx/access.log # следить (в реальном времени) tail -f /var/log/nginx/access.log
Топ IP (кто больше всего запрашивал)
awk '{print $1}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
Топ запрошенных URL (путь/ресурс)
# вытянуть "request" и взять второй токен (URI)
awk -F\" '{print $2}' /var/log/nginx/access.log | awk '{print $2}' | sort | uniq -c | sort -rn | head
Статусы (HTTP codes) — сколько и какие
# если Combined/CLF — статус обычно в $9
awk '{print $9}' /var/log/nginx/access.log | sort | uniq -c | sort -rn
# или надёжнее через field после кавычек
awk -F\" '{print $3}' /var/log/nginx/access.log | awk '{print $1}' | sort | uniq -c | sort -rn
Топ referrers и user agents
# referrers (поле после второго кавычки)
awk -F\" '{print $4}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
# user agents (обычно $6 после разделения по кавычкам)
awk -F\" '{print $6}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
Ошибки 4xx / 5xx и какие страницы вызывают 404
# все 4xx и 5xx (с подсчётом по коду)
awk -F\" '{code = $3; sub(/^ */, "", code); split(code, a, " "); if (a[1] ~ /^[45]/) print a[1]}' /var/log/nginx/access.log \
| sort | uniq -c | sort -rn
# самые частые URI, которые вернули 404
awk -F\" '$3 ~ / 404 / {print $2}' /var/log/nginx/access.log | awk '{print $2}' | sort | uniq -c | sort -rn | head
Сумма переданных байт по IP (трафик)
# в Combined формате размер — в третьем блоке после кавычек (обычно $3 -> второй токен)
awk -F\" '{split($3,a," "); bytes=a[2]; ip=($1); split(ip,b," "); print b[1], (bytes=="-"?0:bytes)}' /var/log/nginx/access.log \
| awk '{sum[$1]+=$2} END{for (i in sum) print sum[i], i}' | sort -rn | head
Запросы в минуту (простая агрегация по минутам)
# вытащить timestamp like 10/Oct/2000:13:55 (до минуты)
awk '{t=substr($4,2,17); print t}' /var/log/nginx/access.log | sort | uniq -c | sort -rn | head
Найти самые медленные запросы (если у вас в логе есть время ответа, например nginx $request_time как последнее поле)
# если request_time — последнее поле
awk '{rt=$NF; $NF=""; print rt, $0}' /var/log/nginx/access.log | sort -nr | head
# альтернативно: вывести топ 20 по времени (если формат другой — адаптируйте вывод поля)
awk '{print $NF, $0}' /var/log/nginx/access.log | sort -k1,1nr | head -n 20
Анализ сжатых логов (gz, bz2, xz)
# gzip
zcat access.log.1.gz | awk -F\" '{print $2}' | awk '{print $2}' | sort | uniq -c | sort -rn | head
# bzip2
bzcat access.log.1.bz2 | ...
# xz
xzcat access.log.1.xz | ...
Поиск по времени / ошибке / IP (grep + контекст)
# все ошибки 500 в логах за последние 10000 строк tail -n 10000 /var/log/nginx/access.log | grep ' 500 ' -n # конкретный IP grep '^1.2.3.4 ' /var/log/nginx/access.log | tail -n 200
Анонимизация IP (на случай расшаривания логов)
# заменить последний октет на XXX sed -E 's/([0-9]+\.[0-9]+\.[0-9]+)\.[0-9]+/\1.XXX/g' /var/log/nginx/access.log > anonymized.log





Comments (0)