如何用cat/ansifilter等工具移除Kubernetes测试日志的ANSI转义序列?
移除Kubernetes一致性测试日志中的转义序列
问题描述
我有一份Kubernetes一致性测试的输出结果:
\u001b[90mtest/e2e/common/network/framework.go:23\u001b[0m Granular Checks: Pods \u001b[90mtest/e2e/common/network/networking.go:32\u001b[0m should function for intra-pod communication: udp [NodeConformance] [Conformance] \u001b[90mtest/e2e/framework/framework.go:652\u001b[0m \u001b[90m------------------------------\u001b[0m
我希望移除所有转义序列以便阅读该输出,但无法控制生成日志的代码,已尝试cat、less -r、ansifilter甚至sed等工具,均未能成功移除转义序列,请问该如何解决?
解决方案
方法1:精准匹配转义序列的sed命令
日志里的转义序列本质是ASCII的ESC字符(对应\x1b),之前的工具失效可能是因为你匹配的是字符串\u001b而非实际的控制字符。用以下命令直接处理:
sed 's/\x1b\[[0-9;]*m//g' 你的日志文件名.log > 清理后日志文件名.log
该命令会全局匹配并删除所有ANSI颜色控制码格式的转义序列。
方法2:更通用的perl处理命令
perl对特殊字符的兼容性更强,能覆盖更多类型的ANSI转义序列,执行:
perl -pe 's/\e\[?.*?[\@-~]//g' 你的日志文件名.log > 清理后日志文件名.log
方法3:Python脚本兜底处理
如果命令行工具都不生效,写个简单的Python脚本一次性清理:
with open("你的日志文件名.log", "r") as in_file, open("清理后日志文件名.log", "w") as out_file: import re # 匹配所有ANSI转义序列的正则 ansi_pattern = re.compile(r'\x1B(?:[@-Z\\-_]|\[.*?[a-zA-Z])') for line in in_file: cleaned_line = ansi_pattern.sub('', line) out_file.write(cleaned_line)
运行脚本后即可得到无转义序列的日志文件。
方法4:终端临时过滤查看
如果只是临时查看不想生成文件,用管道直接输出:
cat 你的日志文件名.log | sed 's/\x1b\[[0-9;]*m//g'
内容的提问来源于stack exchange,提问作者Senthil Kumaran
相关产品推荐
相关产品推荐

