grep、awk、sed 三命令组合可高效完成日志分析:grep 精准过滤关键行并查看上下文,awk 按列提取、统计与格式化字段,sed 负责清洗、替换与预处理,三者管道协作实现复杂分析任务。

日志分析是运维和开发日常中最常遇到的任务之一,而 grep、awk、sed 这三个命令组合使用,能快速完成过滤、提取、统计、格式化等操作,无需写脚本也能应对大部分场景。
精准定位关键行:grep 的实用技巧
grep 是日志分析的第一道筛子,重点在于用对选项提升效率:
- -i 忽略大小写,适合匹配 "error"、"ERROR" 或 "Error";
-
-v 排除干扰项,比如
grep -v "health_check"剔除探针日志; -
-A / -B / -C 查看上下文,
grep -A 2 "timeout" app.log显示匹配行及后两行; -
-E 启用扩展正则,
grep -E "(50[0-9]|404)" access.log一次匹配常见 HTTP 错误码; -
--color=always 配合管道时加
grep --color=never避免颜色字符污染后续处理。
结构化提取字段:awk 的核心用法
日志多为分隔符格式(空格、|、tab、逗号),awk 擅长按列切片和计算:
- 默认以空白分割,
awk '{print $1, $4, $9}' access.log提取 IP、时间、状态码; - 指定分隔符:
awk -F'|' '{print $3, $7}' app.log; - 条件筛选+统计:
awk '$9 ~ /^5/ {count++} END {print count}' access.log统计 5xx 数量; - 去重计数:
awk '{ip[$1]++} END {for (i in ip) print i, ip[i]}' access.log | sort -rnk2; - 格式化输出:
awk '{printf "%-15s %s\n", $1, $4}' access.log对齐列宽便于阅读。
清洗与替换:sed 的轻量编辑能力
sed 适合做日志预处理,比如标准化时间、脱敏、补全字段:
- 删除空行或注释行:
sed '/^#/d;/^$/d' app.log; - 替换时间戳为可读格式(配合外部命令):
sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2})/$(date -d "\1" "+%Y-%m-%d %H:%M")/e'(需 GNU sed); - 脱敏 IP:
sed -E 's/([0-9]{1,3}\.){3}[0-9]{1,3}/***.***.***.***/g' access.log; - 提取某段 JSON 字段(简单场景):
sed -n 's/.*"msg":"\([^"]*\)".*/\1/p' app.log; - 合并连续重复行:
sed '$!N; /^\(.*\)\n\1$/!P; D' log.txt(去重相邻行)。
三剑合璧:典型分析流程示例
分析 Nginx access.log 中“响应超时且状态码为 504”的请求,并统计来源 IP 和平均响应时间:
grep "504" access.log \
| grep "upstream timed out" \
| awk '{print $1, $NF}' \
| awk '{ip[$1]++; total[$1]+=$2; count[$1]++} END {for (i in ip) printf "%s\t%d\t%.2f\n", i, ip[i], total[i]/count[i]}' \
| sort -k2nr
说明:第一层 grep 粗筛,第二层再过滤关键词,awk 先提取 IP 和响应时间($NF 是最后一列),再用第二个 awk 分组聚合,最后排序输出。










