如何按规则为终端输出添加ANSI颜色编码?
实现方案
针对长运行流式输出的my-app,我们可以用awk(推荐)或sed工具,在去除元数据后按规则添加ANSI颜色编码,完美适配实时流式场景。
核心ANSI颜色码
先明确需要用到的终端颜色控制码:
- 灰色(匹配
[+]的文本):\033[90m - 黄色(含
<s:PocApi的行):\033[33m - 浅灰色(含
DBG的行):\033[37m - 红色(含
ERR的行):\033[31m - 颜色重置(恢复默认):
\033[0m
推荐方案:用awk实现(灵活适配多规则)
awk更适合处理「整行染色+局部文本染色」的混合需求,且规则优先级清晰:
my-app | sed 's/.*\] - *//' | awk ' BEGIN { gray = "\033[90m"; yellow = "\033[33m"; light_gray = "\033[37m"; red = "\033[31m"; reset = "\033[0m"; } # 1. 优先处理ERR行(红色整行) /ERR/ { print red $0 reset; next; } # 2. 处理含<s:PocApi的行(黄色整行) /<s:PocApi/ { print yellow $0 reset; next; } # 3. 处理含DBG的行(浅灰色整行) /DBG/ { print light_gray $0 reset; next; } # 4. 最后处理[]文本(仅局部染灰色) { gsub(/\[[^\]]+\]/, gray "&" reset); print $0; } '
规则说明
- 优先级排序:ERR(红色)>
<s:PocApi(黄色)> DBG(浅灰色)>[]文本(灰色),避免规则冲突。 - 整行染色:针对ERR、
<s:PocApi、DBG的行,直接给整行套色后重置。 - 局部染色:仅将行内
[...]格式的文本染成灰色,不影响其他内容。 - 流式兼容:awk逐行处理输入,实时响应
my-app的输出。
替代方案:用sed实现(纯文本处理工具)
如果偏好sed,可组合多规则命令(注意规则顺序必须从高优先级到低):
my-app | sed 's/.*\] - *//' | sed -e ' # 处理ERR行(红色) s/^\(.*ERR.*\)/\x1b[31m\1\x1b[0m/ # 处理<s:PocApi行(黄色) s/^\(.*<s:PocApi.*\)/\x1b[33m\1\x1b[0m/ # 处理DBG行(浅灰色) s/^\(.*DBG.*\)/\x1b[37m\1\x1b[0m/ # 处理[]文本(灰色) s/\[[^\]]*\]/\x1b[90m&\x1b[0m/g '
内容的提问来源于stack exchange,提问作者Chris Miller
相关产品推荐
相关产品推荐

