sed 是处理 nginx 日志的利器,可精准提取ip与路径、过滤状态码、清洗脱敏、合并空格,并常与 awk/sort/uniq 等组合实现高效日志分析。

sed 是处理 Nginx 日志这类结构化文本的利器,尤其适合快速提取、过滤、替换和格式化。关键在于理解 Nginx 日志默认格式(或你自定义的 format),再结合正则表达式精准定位字段。
提取客户端 IP 和请求路径
Nginx 默认日志形如:192.168.1.100 - - [10/Jan/2024:08:30:22 +0000] "GET /api/users HTTP/1.1" 200 1234 ...。IP 在开头,路径在引号内第二个字段:
- 提取 IP:
sed -n 's/^\([^ ]*\).*/\1/p' access.log - 提取请求路径(含方法):
sed -n 's/^[^"]*"\([^"]*\)".*/\1/p' access.log - 只提取路径(不含 GET/POST):
sed -n 's/^[^"]*"[^ ]* \([^ ]*\).*/\1/p' access.log
过滤特定状态码或错误请求
用 -n 关闭自动打印,配合 p 命令只输出匹配行:
- 只看 404 请求:
sed -n '/" 404 /p' access.log - 排除健康检查路径(如 /health):
sed '/\/health/d' access.log - 筛选 5xx 错误并高亮显示(配合终端颜色):
sed -n '/" 5[0-9][0-9] /p' access.log | sed 's/.*"/\x1b[31m&\x1b[0m/'
清洗日志:删除时间戳或脱敏 IP
批量修改日志用于测试或归档时,sed 的替换能力很实用:
- 移除方括号内的时间戳:
sed 's/\[[^]]*\]//g' access.log - 将 IPv4 地址后两段脱敏为 0(如 192.168.1.100 → 192.168.0.0):
sed -E 's/^([0-9]{1,3}\.[0-9]{1,3}\.)[0-9]{1,3}\.[0-9]{1,3}/\10.0/' access.log - 合并连续空格为单个空格(标准化字段分隔):
sed 's/[[:space:]]\+/ /g' access.log
与其它命令组合提升效率
单独用 sed 功能有限,搭配 awk、sort、uniq 才真正高效:
- 统计各路径访问次数:
sed -n 's/^[^"]*"[^ ]* \([^ ]*\).*/\1/p' access.log | sort | uniq -c | sort -nr - 提取所有 User-Agent 并去重:
sed -n 's/.*" \(.*\)"$/\1/p' access.log | sort -u - 实时监控新增 500 错误:
tail -f access.log | sed -n '/" 500 /p'











