温馨提示×

如何用awk处理nginx日志

小樊
37
2026-09-11 13:42:05
栏目: 编程语言

下面从最常见需求出发,讲清楚如何用 awk 处理 Nginx 日志,包括日志格式、常用分析命令、字段解析和实战示例


一、先确认 Nginx 日志格式

1. 默认日志格式(combined)

常见于 /var/log/nginx/access.log

192.168.1.10 - - [10/Oct/2024:14:32:01 +0800] "GET /index.html HTTP/1.1" 200 1024 "https://example.com" "Mozilla/5.0"

对应字段含义:

字段 含义
$1 IP
$4 时间
$6 请求方法
$7 URL
$9 状态码
$10 响应大小

二、awk 基本用法

awk '条件 {动作}' 日志文件

示例:

awk '{print $1}' access.log

三、常见 nginx 日志分析场景

1️⃣ 统计访问 IP 排行(Top 10)

awk '{print $1}' access.log | sort | uniq -c | sort -nr | head

2️⃣ 统计每个 URL 的访问次数

awk '{print $7}' access.log | sort | uniq -c | sort -nr | head

3️⃣ 统计 HTTP 状态码分布

awk '{print $9}' access.log | sort | uniq -c | sort -nr

4️⃣ 统计 404 请求

awk '$9 == 404 {print $1, $7}' access.log

5️⃣ 统计某个 IP 的访问情况

awk '$1 == "192.168.1.10"' access.log

6️⃣ 统计某时间段访问量(按小时)

awk '{print substr($4,14,2)}' access.log | sort | uniq -c

说明:

  • $4[10/Oct/2024:14:32:01
  • substr($4,14,2):取小时 14

7️⃣ 统计 PV / UV

# PV
wc -l access.log

# UV
awk '{print $1}' access.log | sort -u | wc -l

四、处理自定义日志格式(推荐)

示例:log_format

log_format main '$remote_addr - $time_local '
                '"$request" $status $body_bytes_sent';

日志:

192.168.1.10 - [10/Oct/2024:14:32:01 +0800] "GET /api HTTP/1.1" 200 512

使用 -F 指定分隔符:

awk -F'"' '{print $1, $2, $3}' access.log

或更精确:

awk '{ip=$1; method=$6; url=$7; status=$9; print ip, method, url, status}' access.log

五、awk 进阶:计算总流量

awk '{sum+=$10} END {print sum " bytes"}' access.log

人类可读:

awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log

六、实战:统计访问最多的 URL + IP

awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr | head

七、性能建议(大日志)

✅ 适合 awk 的场景:

  • 单文件分析
  • 快速排查
  • 脚本化统计

❌ 不适合:

  • 多天聚合
  • 复杂查询(用 ELK / ClickHouse)

八、总结一句话

awk 是 nginx 日志分析的瑞士军刀:快、轻、强

如果你愿意,可以:

  • 发一段真实 nginx 日志
  • 或说明你想统计什么指标

我可以直接帮你写 awk 命令 / shell 脚本

0