Nginx 日志统计 6 大任务 + 高频易错点速查 · 拆分自 Linux01 命令系统实战笔记

十二、综合实战:Nginx 日志统计

测试日志样例

192.168.1.12 - - [01/Oct/2026] "GET /d" 500
192.168.1.10 - - [01/Oct/2026] "GET /a" 200
192.168.1.10 - - [01/Oct/2026] "GET /b" 200
192.168.1.10 - - [01/Oct/2026] "POST /api/login" 200
192.168.1.15 - - [01/Oct/2026] "GET /test" 404
192.168.1.16 - - [01/Oct/2026] "GET /abc" 404

任务 1:统计每个 IP 访问次数,取 Top 3

传统管道方案:

tr -s ' ' access.log | cut -d' ' -f1 | sort | uniq -c | sort -nr | head -3

awk 方案:

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

任务 2:统计 HTTP 状态码分布

tr -s ' ' access.log | cut -d' ' -f9 | sort | uniq -c
# 或 awk
awk '{status[$9]++} END {for(k in status) print status[k], k}' access.log | sort -nr

任务 3:只提取 5xx 错误日志的 IP

grep ' 500$' access.log | awk '{print $1}'
# 或
awk '$9 >= 500 {print $1}' access.log

任务 4:统计 POST 接口访问量

grep POST access.log | awk '{print $1}' | sort | uniq -c

任务 5:sed + awk 综合清洗

需求:删除 404 行,替换请求方法,提取 IP/方法/状态码

sed '/ 404$/d' access.log \
| sed -E 's/"GET/METHOD_GET/; s/"POST/METHOD_POST/' \
| awk '{print $1, $6, $9}'

任务 6:sed 反向引用给 IP 加标签

sed -E 's/^([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+)/client:\1/' access.log

十三、高频易错点速查表

# 易错点 正确认知
1 > 会先清空文件 哪怕命令失败,文件也被清空
2 2>&1 顺序 必须放在 > file 后面,不能反过来
3 uniq 不用 sort uniq 只合并相邻重复行,必须先 sort
4 find 找内容 find 找文件,grep 找文件内容
5 & 就是后台常驻 & 只是当前终端后台,关终端就死;要 nohup
6 jobs 看所有进程 jobs 只看当前终端的任务
7 kill -9 随便用 先 kill(15) 优雅退出,不行再 -9
8 xargs 处理带空格文件名 用 find -print0 \| xargs -0
9 -n1 解决空格分割 -n1 不改变分割规则,默认仍按空格切
10 * 匹配任意字符 * 是前面字符0次或多次;任意字符串用 .*
11 . 就是小数点 . 匹配任意字符,小数点要写 \.
12 cut 处理多空格 cut 只认单字符分隔,多空格用 awk
13 sed -i 直接改 先不加 -i 预览,确认后再加;推荐 -i.bak
14 管道传 stderr 管道只传 stdout,stderr 要 2>&1 \| 或 \|&
15 which 能查内置命令 which 只查外部程序,内置命令用 type
16 tail -f 跟踪重建文件 文件重建用 tail -F
17 目录没有 x 能进 目录必须有 x 才能 cd 进入
18 nohup 后 jobs 能看到 nohup 脱离作业管理,jobs 看不到,用 ps

📌 学习路线总结:
文件查看(cat/less/head/tail) → 查找(find/which/type/man) → 权限(chmod/chown) → 进程(ps/top/kill/jobs/bg/fg/nohup) → 重定向与管道 → xargs → 文本工具(grep/cut/sort/uniq/tr/wc) → awk → sed → 正则 → 日志实战

🔗 相关笔记