You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 07:42:15