下面从最常见需求出发,讲清楚如何用 awk 处理 Nginx 日志,包括日志格式、常用分析命令、字段解析和实战示例。
常见于 /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 '{print $1}' access.log
awk '{print $1}' access.log | sort | uniq -c | sort -nr | head
awk '{print $7}' access.log | sort | uniq -c | sort -nr | head
awk '{print $9}' access.log | sort | uniq -c | sort -nr
awk '$9 == 404 {print $1, $7}' access.log
awk '$1 == "192.168.1.10"' access.log
awk '{print substr($4,14,2)}' access.log | sort | uniq -c
说明:
$4:[10/Oct/2024:14:32:01substr($4,14,2):取小时 14# PV
wc -l access.log
# UV
awk '{print $1}' access.log | sort -u | wc -l
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 '{sum+=$10} END {print sum " bytes"}' access.log
人类可读:
awk '{sum+=$10} END {print sum/1024/1024 " MB"}' access.log
awk '{print $1, $7}' access.log | sort | uniq -c | sort -nr | head
✅ 适合 awk 的场景:
❌ 不适合:
awk 是 nginx 日志分析的瑞士军刀:快、轻、强
如果你愿意,可以:
我可以直接帮你写 awk 命令 / shell 脚本。