在使用snmpget的Bash脚本中按阈值为电力负载值设置显示颜色
实现方案
第一步:修正颜色变量
你现有的颜色变量里的\[、\]是 Bash 提示符(PS1)专用的转义包裹符,普通脚本输出时会显示乱码,需要先修正,同时补充重置颜色的变量避免后续终端输出被持续染色:
# 加粗红色 BRed="\033[1;31m" # 加粗黄色 BYellow="\033[1;33m" # 重置颜色为终端默认值 Reset="\033[0m"
第二步:添加通用染色函数(适配顶部普通输出场景)
写一个复用函数处理负载数值的染色逻辑,避免重复写判断代码,同时支持小数数值比较:
# 传入负载数值,返回带对应颜色的输出字符串 colorize_load() { local load_val=$1 if (( $(echo "$load_val >= 90" | bc -l) )); then echo -e "${BRed}${load_val}%${Reset}" elif (( $(echo "$load_val >= 76" | bc -l) )); then echo -e "${BYellow}${load_val}%${Reset}" else echo -e "${load_val}%" fi }
第三步:修改顶部普通输出逻辑
把原来直接打印负载的行,替换为调用染色函数的形式,注意echo需要加-e参数才能正确解析ANSI颜色转义序列:
echo -e "Date: $DATE" echo "=========================" echo -e "$OND1 Phases ==> L1: $(colorize_load $OND1L1) L2: $(colorize_load $OND1L2) L3: $(colorize_load $OND1L3)" echo "---------------------------------------------------" echo -e "$OND2 Phases ==> L1: $(colorize_load $OND2L1) L2: $(colorize_load $OND2L2) L3: $(colorize_load $OND2L3)" echo "---------------------------------------------------" echo -e "$OND3 Phases ==> L1: $(colorize_load $OND3L1) L2: $(colorize_load $OND3L2) L3: $(colorize_load $OND3L3)" echo "---------------------------------------------------"
第四步:修改awk格式化输出逻辑
如果需要awk输出的部分也支持染色,将Bash侧的颜色变量传入awk,在awk内部实现染色判断即可:
if [ $BrutMode == 1 ]; then # BrutMode不需要百分号和颜色可保留原逻辑,需要染色参考下方else分支的写法修改即可 echo "$DATE $OND1L1 $OND1L2 $OND1L3 $OND2L1 $OND2L2 $OND2L3 $OND3L1 $OND3L2 $OND3L3" | awk '{printf " %s %s %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f %4.1f\n",$1,$2,$3,$4,$5,$6,$7,$8,$9,$10,$11}' else echo "$DATE $OND1L1 $OND1L2 $OND1L3 $OND2L1 $OND2L2 $OND2L3 $OND3L1 $OND3L2 $OND3L3" | awk -v BRed="$BRed" -v BYellow="$BYellow" -v Reset="$Reset" ' function color(v) { if (v >= 90) return BRed v "%" Reset else if (v >=76) return BYellow v "%" Reset else return v "%" } {printf " %s %s %s %s %s %s %s %s %s %s %s\n",$1,$2,color($3),color($4),color($5),color($6),color($7),color($8),color($9),color($10),color($11)}' fi
可选优化
如果需要将脚本输出重定向到日志文件,可在脚本开头添加终端判断逻辑,只有在交互式终端运行时才启用颜色,避免日志中出现乱码转义字符:
if [ ! -t 1 ]; then BRed="" BYellow="" Reset="" fi
内容的提问来源于stack exchange,提问作者Billy
相关产品推荐
相关产品推荐

