sed可单命令清理日志中的时间戳、ANSI颜色码、控制字符等,需精准编写正则表达式,支持多-e串联、$'...'处理转义、:a;N;$!ba跨行匹配,但复杂结构建议配合awk或perl。

用 sed 清理日志中的特殊字符和时间戳,核心是写准正则表达式,匹配要删的内容后用空字符串替换。不需要额外工具,一条命令就能批量处理。
删除常见时间戳格式
日志里的时间戳样式多(如 [2024-03-15 10:22:34]、Mar 15 10:22:34、2024/03/15-10:22:34.123),可用多个 -e 参数串联处理:
-
sed -e 's/\[[^]]*\]//g' -e 's/^[A-Za-z]\{3\} [0-9]\{1,2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} //'—— 清掉方括号时间 + syslog 风格开头 -
sed -r 's/([0-9]{4}-[0-9]{2}-[0-9]{2} [0-9]{2}:[0-9]{2}:[0-9]{2}(\.[0-9]+)?)//g'—— 匹配 ISO 格式时间(含可选毫秒)
过滤控制字符和不可见符号
日志中常混入 ANSI 转义序列(如颜色代码 \x1b[32m)、回车符 \r、制表符 \t 等。用十六进制或 POSIX 字符类清理:
-
sed $'s/\x1b\[[0-9;]*m//g'—— 去除 ANSI 颜色码(注意用 `$'...'` 支持转义) -
sed 's/[\r\t]//g'—— 删除回车和制表符 -
sed 's/[^[:print:][:space:]]//g'—— 保留可打印字符和空白,剔除其他所有(比如 \x00、\x07)
组合使用并保留关键结构
实际清理时别一刀切,避免误删有用字段。推荐分步测试再固化命令:
- 先备份:
cp app.log app.log.bak - 试运行(不改原文件):
sed -e 's/\[[^]]*\]//g' -e 's/\x1b\[[0-9;]*m//g' -e 's/[^[:print:][:space:]]//g' app.log | head -20 - 确认无误后覆盖:
sed -i -e 's/.../.../g' app.log(-i直接修改,慎用)
处理多行日志块(如 Java 异常栈)
遇到换行的堆栈信息,单行 sed 默认不跨行匹配。可借助 :a;N;$!ba; 读入全部内容再处理:
-
sed ':a;N;$!ba;s/^\([A-Za-z]\{3\} [0-9]\{1,2\} [0-9]\{2\}:[0-9]\{2\}:[0-9]\{2\} \)\(.*\)/\2/g' app.log—— 把每段开头的时间前缀去掉,保留后续多行内容 - 更稳妥的做法是配合
awk或perl处理复杂结构,sed适合规则清晰的单行清洗
不复杂但容易忽略细节:注意正则贪婪性、字符集编码(UTF-8 下某些符号需用 [[:punct:]] 而非点号)、以及是否需要保留原始换行。先小范围验证,再批量执行。


















