macOS日志清洗核心是用grep、awk、sed、sort四工具管道串联,每步只做一件事:先grep筛选有效行,再awk/cut按分隔符提取字段,sed预处理脏格式,最后标准化时间、空格、敏感信息等。
macos 上用 shell 脚本清洗复杂日志,核心不是写大段逻辑,而是把 grep、awk、sed、sort 这四个工具像积木一样串起来——每一步只做一件明确的事,靠管道(|)传递中间结果。
先定位关键字段再切分结构
日志通常混杂时间戳、IP、状态码、路径等,直接正则匹配易出错。推荐先用 awk 或 cut 按固定分隔符(如空格、竖线、方括号)提取列:
- 如果日志是 Nginx 默认格式(空格分隔),用
awk '{print $1, $4, $7, $9}' access.log提取 IP、时间、URL、状态码 - 若含中括号(如
[28/Jul/2026:14:22:01 +0800]),可用awk -F'[][]' '{print $2, $4}'拆出时间和时区 - 遇到字段含空格(如 User-Agent),优先用
sed预处理:先替换内部空格为下划线,再用awk切分
用 grep 精准筛选有效行
别让脏数据进后续流程。用 grep 做第一道过滤:
-
grep -E '^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}'只留含 IPv4 的行 -
grep -v '404\|500\|healthz'排除错误码和探针请求 -
grep -w 'POST\|GET'限定 HTTP 方法,避免匹配到 URL 中的子串 - 加
--color=auto实时验证匹配效果,避免误删
用 sed 和 awk 处理脏格式
清洗不是“删”,而是“标准化”:
- 统一时间格式:
sed 's/\[//; s/\]//; s#/#-#g'去掉方括号、斜杠转短横线 - 清理多余空格:
awk '{$1=$1};1'自动压缩连续空格并重排字段 - 替换敏感信息:
sed 's/\"[^\"]*@[^\"\"]*\"/\"[EMAIL REDACTED]\"/g'用正则模糊脱敏邮箱 - 补全缺失字段:
awk '{if(NF 补齐列数,避免后续 cut 错位
排序去重与抽样验证
最后一步确保输出可控、可复现:
- 按时间排序:
sort -k2,2(假设第2列是时间字段),加-r逆序 - 去重保留首行:
awk '!seen[$1,$4]++'对 IP+URL 组合去重 - 快速抽样验证:
head -n 100 | tail -n 20看中间段是否干净,比看头尾更可靠 - 导出为 CSV:
awk -v OFS=',' '{$1=$1; print}'自动用逗号分隔,兼容 Excel
不复杂但容易忽略:所有命令默认处理标准输入,所以组合时不用反复写文件名;用 tee 中间保存快照(如 ... | tee cleaned.log | ...),调试时随时回溯。


















