Linux bash中使用SED高亮0/1匹配项前后指定长度字符的方法
实现方案
需求为仅使用sed实现:匹配日志中0/1的Pod异常状态时,将该字符串及其前后各31个字符一同高亮,同时解决watch执行脚本时的颜色显示异常问题,全程不使用grep。
1. 核心sed命令说明
原有命令仅高亮0/1本身,且通过嵌套printf拼接ANSI颜色码的写法,在watch的非交互shell环境下容易出现转义解析错误,是颜色异常的核心诱因。
直接使用GNU sed内置的十六进制转义符写入ANSI颜色序列,通过扩展正则匹配前后最多31个字符(自动兼容行首、行尾不足31字符的场景,不会出现匹配截断),命令如下:
sed -Eu 's/(^.{0,31})?(0\/1)(.{0,31})?/\x1b[1;31m\1\2\3\x1b[0m/g' /home/McFly/myPods.log
正则逻辑说明:
-E:启用扩展正则,简化长度匹配语法,无需转义大括号、问号等元字符(^.{0,31})?:捕获0/1起始位置前最多31个字符,若当前位置距行首不足31字符则捕获全部前缀内容(0\/1):精确匹配Pod异常状态字符串(.{0,31})?:捕获0/1结束位置后最多31个字符,若当前位置距行尾不足31字符则捕获全部后缀内容\x1b[1;31m:sed内置转义写法,对应亮红色高亮属性,无需嵌套外部printf命令,避免shell解析误差\x1b[0m:重置终端颜色,避免后续内容被错误染色- 若两个
0/1间隔小于62字符,该写法会自动合并高亮区间,不会出现颜色嵌套导致的乱码
2. watch执行颜色异常修复
将以下内容写入myScript.sh脚本:
#!/bin/bash sed -Eu 's/(^.{0,31})?(0\/1)(.{0,31})?/\x1b[1;31m\1\2\3\x1b[0m/g' /home/McFly/myPods.log
给脚本添加可执行权限:
chmod +x ./myScript.sh
执行watch命令时显式指定--color=always,兼容不同版本watch的参数默认逻辑,命令如下:
watch -n 1 --color=always ./myScript.sh
内容的提问来源于stack exchange,提问作者McFly
相关产品推荐
相关产品推荐

