温馨提示×

怎样用awk分析nginx日志

小樊
44
2026-10-02 16:27:03
栏目: 编程语言

下面从基础到实战,系统讲讲怎么用 awk 分析 Nginx 日志。常见的 Nginx 日志格式是 combined 或 main,先以最常见的 combined 格式为例。


一、先认识 Nginx 日志格式

默认 combined 格式示例:

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

字段含义(按顺序):

  1. $remote_addr 客户端 IP
  2. $remote_user 远程用户
  3. $time_local 时间
  4. 请求行(方法 + URL + 协议)
  5. $status 状态码
  6. $body_bytes_sent 发送字节数
  7. $http_referer 来源
  8. $http_user_agent 浏览器

二、awk 基础用法(必须知道)

awk '{print $1}' access.log

⚠️ 注意:Nginx 日志不是纯空格分隔,所以常配合 -F 指定分隔符。


三、常用分析场景(实战)

1️⃣ 统计访问最多的 IP

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

或纯 awk:

awk '{ip[$1]++} END {for(i in ip) print ip[i], i}' access.log | sort -nr

2️⃣ 统计状态码分布

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

只看 4xx / 5xx:

awk '$9 ~ /^4|^5/ {print $9}' access.log | sort | uniq -c

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

usually 第 7 字段是 URL(注意引号):

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

4️⃣ 统计流量最大的 IP(按字节)

awk '{bytes[$1]+=$10} END {for(i in bytes) print bytes[i], i}' access.log | sort -nr | head

5️⃣ 按小时统计请求量

awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c

或更精准:

awk -F'[:[]' '{print $2}' access.log | sort | uniq -c

6️⃣ 统计爬虫 / 浏览器

awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr

7️⃣ 找出访问异常快的 IP(CC 攻击)

比如 1 秒内多次访问:

awk '{print $1, $4}' access.log | awk '{print $1}' | sort | uniq -c | awk '$1>100'

四、如果你的日志是 JSON(现代 Nginx)

log_format json '{ "time":"$time_local", "ip":"$remote_addr", "status":$status }';

分析方式不同:

grep '"status":500' access.log
# 或用 jq
jq 'select(.status==500)' access.log

五、性能建议

  • 大日志先 grep 过滤再 awk
  • 避免多次管道
  • 超过 1G 日志建议 awk + sort 分块

六、我可以直接帮你写

如果你愿意:

  • 贴一段 真实日志
  • 或告诉我 Nginx log_format
  • 或你想分析的目标(IP / 接口 / 性能 / 安全)

我可以直接帮你写精准的 awk 命令。

0 踩