下面从基础到实战,系统讲讲怎么用 awk 分析 Nginx 日志。常见的 Nginx 日志格式是 combined 或 main,先以最常见的 combined 格式为例。
默认 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"
字段含义(按顺序):
$remote_addr 客户端 IP$remote_user 远程用户$time_local 时间$status 状态码$body_bytes_sent 发送字节数$http_referer 来源$http_user_agent 浏览器awk '{print $1}' access.log
⚠️ 注意:Nginx 日志不是纯空格分隔,所以常配合 -F 指定分隔符。
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
awk '{print $9}' access.log | sort | uniq -c | sort -nr
只看 4xx / 5xx:
awk '$9 ~ /^4|^5/ {print $9}' access.log | sort | uniq -c
usually 第 7 字段是 URL(注意引号):
awk -F'"' '{print $2}' access.log | awk '{print $2}' | sort | uniq -c | sort -nr | head
awk '{bytes[$1]+=$10} END {for(i in bytes) print bytes[i], i}' access.log | sort -nr | head
awk '{print $4}' access.log | cut -d: -f2 | sort | uniq -c
或更精准:
awk -F'[:[]' '{print $2}' access.log | sort | uniq -c
awk -F'"' '{print $6}' access.log | sort | uniq -c | sort -nr
比如 1 秒内多次访问:
awk '{print $1, $4}' access.log | awk '{print $1}' | sort | uniq -c | awk '$1>100'
log_format json '{ "time":"$time_local", "ip":"$remote_addr", "status":$status }';
分析方式不同:
grep '"status":500' access.log
# 或用 jq
jq 'select(.status==500)' access.log
grep 过滤再 awkawk + sort 分块如果你愿意:
我可以直接帮你写精准的 awk 命令。