我将系统的硬盘温度输出到本地网络服务器上的文本文件,以便每隔一段时间检查一次,以便在系统负载下监控硬盘温度。我想知道是否有办法突出显示温度是否超过某个数字。这是我得到的输出示例(我通过列进行管道传输,以便很好地排列列):
hddtemp -w /dev/sdg /dev/sdh /dev/sdi /dev/sda /dev/sdb | 列-t -s“:”
/dev/sdg ST4000NM0033-9ZM170 46°C
/dev/sdh ST4000NM0033-9ZM170 44°C
/dev/sdi Hitachi HUA723030ALA641 43°C
/dev/sda ST4000NM0033-9ZM170 43°C
/dev/sdb Hitachi HUA723030ALA641 44°C
在显示温度的右侧,如果温度超过 50 摄氏度,我想将其设为红色。我假设有一种方法可以用 grep 来实现,但我不确定这是否是唯一(或最佳)的方法。而且我不确定如何处理其中的“dregee”C 部分。
答案1
以下面的 shell 函数为例,它是我的其他答案。这将检测以空格或制表符开头、以 ASCII 数字 + 结尾的字符串°C
,其中中间有5
、6
、7
或8
或9
多个 ASCII 数字(以涵盖温度升至 99°C 以上的情况)。在每个这样的字符串中,前导空格或制表符后的部分将突出显示。
这是函数:
highlight() (
if [ -t 1 ] || [ "$1" = -f ]; then
start="$(tput bold)"
end="$(tput sgr0)"
sed -E "s#([[:blank:]])(([56789]|[0123456789]{2,})[0123456789]°C)#\\1$start\\2$end#g;"
else
cat
fi
)
这是一个过滤器。在管道中使用它,例如:
hddtemp … | column … | highlight
笔记:
- 正则表达式适用于字符串和字符,而不适用于数字。一般来说,翻译任意的数字范围到模式。在这里我设法以一种相对简单的方式做到这一点,但
50°C
需要注意的是。排除50
而包括51
及以上会使模式复杂化。 - 我故意使用
[0123456789]
(而不是例如[[:digit:]]
)来仅匹配这些字符,而不管您的语言环境是什么。 tput bold
此类产品不可移植。请start=
根据end=
需要进行调整。sed
代码中#
用作 的分隔符s
。 重要的是不要使用或#
的扩展。 根据您的需要进行调整。 请记住几乎可以使用任何字符作为分隔符。$start
$end
s
sed
- 过滤器会测试其标准输出是否为终端。如果不是,则变为
cat
(即无操作过滤器)。您可以使用 强制突出显示非终端highlight -f
。