如何过滤命令输出中的ANSI转义序列,去除颜色代码?
解决远程grep着色输出与纯文本保存的冲突问题
问题根源
使用ssh -t时,远程主机的grep会判定输出连接的是终端,因此通过--color参数输出包含ANSI颜色转义码的内容;当用tee保存输出时,这些转义码会被一并写入文件,导致文件包含无用的控制字符。
可行解决方案
我们需要实现终端显示着色输出,同时保存到文件的内容为纯文本,以下是两种实用方法:
方法一:进程替换分离输出流
通过tee将输出同时发送到终端(保留颜色)和一个处理转义码的进程,处理后的内容写入文件:
ssh -t box grep --color=always needle haystack.txt | tee >(sed -r 's/\x1b\[[0-9;]*m//g' > record.txt)
--color=always:强制grep输出颜色转义码,确保终端能显示着色效果tee >(...):进程替换语法,将输出分两路:一路直接输出到当前终端(正常显示颜色),另一路通过sed移除所有ANSI颜色转义码后写入record.txt
方法二:移除ssh -t并强制着色(简化版)
如果本地终端支持解析ANSI转义码,可以去掉ssh -t,直接强制grep输出颜色,再用同样的方式处理文件保存:
ssh box grep --color=always needle haystack.txt | tee >(sed -r 's/\x1b\[[0-9;]*m//g' > record.txt)
这种方式更简洁,只要本地终端支持颜色显示,就能看到和带-t时一致的着色效果,同时文件保存纯文本。
效果验证
执行命令后:
- 终端会正常显示
grep匹配结果的着色效果 - 打开
record.txt,里面只会包含纯文本的匹配内容,无任何颜色转义码
内容的提问来源于stack exchange,提问作者Mark VY
相关产品推荐
相关产品推荐

