grep 和 sed 组合提取日志的核心是先用 grep 快速筛选目标行,再用 sed 精准裁剪或替换内容;两者通过管道串联,无需临时文件,适合运维和开发日常排查。

用 grep 和 sed 组合提取日志信息,核心是先用 grep 快速筛选目标行,再用 sed 精准裁剪或替换内容。两者配合灵活、无需临时文件,适合运维和开发日常排查。
用 grep 筛出含关键词的日志行
grep 负责“找”,常用选项有:
-
-i:忽略大小写,比如grep -i "error" /var/log/syslog -
-E:启用扩展正则,支持|(或)、+、?等,如grep -E "(404|500)" access.log -
-A/-B:显示匹配行的后几行或前几行,便于看上下文,例如grep -A 2 "OutOfMemoryError" catalina.out -
--line-buffered:配合tail -f实时过滤时避免缓存延迟
用 sed 提取字段或清理格式
sed 负责“切”或“改”,常见提取场景:
Linux 性能分析与调优专家,覆盖 CPU、内存、磁盘 I/O、网络、内核参数、编译优化、容器/K8s。适用场景:系统卡顿/高负载、内存不足/OOM/Swap 高、CPU 异常/iowait 高。
- 按分隔符取第 N 列:
sed -n 's/^[^ ]* ([^ ]*).*//p'(提取第二列) - 只保留 IP 地址:
sed -n 's/.*([0-9]{1,3}.[0-9]{1,3}.[0-3]{1,3}.[0-9]{1,3}).*//p' - 删除多余空格或括号:
sed 's/^[[:space:]]*//; s/[[:space:]]*$//; s/[[]]//g' - 替换时间戳为可读格式(需配合其他工具如
awk更方便,但sed可做简单映射)
组合使用:管道串联,一气呵成
把 grep 输出直接交给 sed 处理,例如:
- 提取 Nginx 日志中的状态码和响应大小:
grep "POST /api/" access.log | sed -n 's/.*"([^"]*)" ([0-9]+) ([0-9]+).*/ /p' - 查失败登录并提取用户名:
grep "Failed password" /var/log/auth.log | sed -n 's/.*for (.*) from.*//p' | sort | uniq -c | sort -nr - 过滤并美化 JSON 日志片段(前提是结构较规整):
grep '"level":"error"' app.log | sed 's/\n//g; s/{/ {/g'
注意转义和性能小细节
实际用时容易踩坑的地方:
- 正则中特殊字符如
.、*、[、]在sed里要加反斜杠转义;用-r(GNU)或-E(macOS)可简化 - 日志量大时,先
grep再sed比全用sed效率高——因为grep是 C 实现的快速字符串匹配 - 如果要多次提取不同字段,
awk通常比sed更直观;但单步清洗或简单替换,sed更轻量 - 测试命令时,先用
head -20验证效果,避免全量跑错影响响应速度










