如何为Oracle ASMCMD lsdg输出按条件设置红色背景?
实现ASMCMD lsdg输出低可用空间行红色背景的几种方案
我之前也碰到过类似的需求,给你几个实用的方案,不用PL/SQL也能轻松搞定:
方案1:用Awk+ANSI终端颜色码(终端查看友好)
如果你的每日检查清单主要是在终端查看,直接用Awk给符合条件的行加上红色背景的ANSI转义序列就行,终端会自动解析这些代码显示颜色,不会出现乱码。
先确认Usable_file_MB在asmcmd lsdg输出中的列位置(不同Oracle版本可能略有差异),比如典型输出里它是第9列。然后写个简单的脚本处理输出:
# 定义阈值:20GB = 20*1024 MB THRESHOLD=$((20*1024)) # 处理lsdg输出并追加到每日文件 $ORACLE_HOME/bin/asmcmd lsdg | awk -v threshold="$THRESHOLD" ' BEGIN { # ANSI颜色码:红色背景、重置格式 red_bg = "\033[41m" reset = "\033[0m" } # 表头行直接输出 NR == 1 { print $0; next } # 数据行判断Usable_file_MB(这里假设是第9列,根据实际调整) { if ($9 + 0 < threshold) { print red_bg $0 reset } else { print $0 } }' >> "$DAILY"
注意点:
- 执行前先跑
asmcmd lsdg | head -2数清楚Usable_file_MB是第几列,把脚本里的$9改成对应列数。 - 如果
Usable_file_MB出现负数(比如磁盘组配置问题),这个逻辑也会把它高亮,符合预期。
方案2:生成HTML格式报告(存档/分享友好)
如果你的每日检查清单需要存档或者分享给其他团队,纯文本带ANSI码看起来会乱,不如直接生成HTML格式的报告,用CSS样式设置红色背景:
# 先写入HTML头部 echo "<html><head><title>ASM磁盘组每日检查</title></head><body><table border='1' cellpadding='4'>" >> "$DAILY" THRESHOLD=$((20*1024)) # 处理lsdg输出为HTML表格行 $ORACLE_HOME/bin/asmcmd lsdg | awk -v threshold="$THRESHOLD" ' BEGIN { print "<tr>" } # 表头行生成<th>标签 NR == 1 { for (i=1; i<=NF; i++) { print "<th>" $i "</th>" } print "</tr>" next } # 数据行判断后生成带样式的<tr> { if ($9 + 0 < threshold) { print "<tr style=\"background-color: #ff4444;\">" } else { print "<tr>" } for (i=1; i<=NF; i++) { print "<td>" $i "</td>" } print "</tr>" }' >> "$DAILY" # 写入HTML尾部 echo "</table></body></html>" >> "$DAILY"
生成的HTML文件用浏览器打开就能看到清晰的红色背景行,非常直观,适合跨团队分享。
方案3:结合sed做文本替换(简单固定场景)
如果不想用Awk,也可以用sed配合正则表达式,但逻辑会稍微复杂一点,适合列位置完全固定的场景:
THRESHOLD=$((20*1024)) RED_BG="\033[41m" RESET="\033[0m" $ORACLE_HOME/bin/asmcmd lsdg | sed -e "1b" -e "/^.*[[:space:]]\{1,\}[0-9]\{1,\}[[:space:]]\{1,\}[0-9]\{1,\}[[:space:]]\{1,\}\([0-9]\{1,\}\).*$/ { s//\1/ /^[0-9]\{1,$(echo ${#THRESHOLD})\}$/ { /^$THRESHOLD$/! { x s/^/$RED_BG/ s/$/$RESET/ x } } x }" >> "$DAILY"
不过这个方案对列位置的依赖很强,一旦Oracle版本更新导致列顺序变化就会失效,只推荐在简单固定场景使用。
内容的提问来源于stack exchange,提问作者Lilz
相关产品推荐
相关产品推荐

