0

我有一个使用“tempmonitor”为 OS X 编写的脚本,我正在尝试将其转换为在 Ubuntu 下与 lm-sensors 一起使用。

这是原始 OS X 脚本,读取 XServe 入口上的环境传感器温度:

#!/bin/bash

/Users/admin/TemperatureMonitor.app/Contents/MacOS/tempmonitor -f -a -l | grep AMBIENT > /tmp/temperature.txt

    filecontent=( `cat "/tmp/temperature.txt" `)

    temp1=`echo "${filecontent[3]} * 10 "|bc | sed 's/[.].*//'`
    temp2=`echo "${filecontent[10]} * 10 "|bc | sed 's/[.].*//'`


    if  (( $temp1 >= 900 || $temp2 >= 900 )); then
            EMAIL="network.services@domain.com"
            SUBJECT="MAIL01 INLET TEMPERATURE EXCEEDED!"
            mail -s "$SUBJECT" "$EMAIL" < /tmp/temperature.txt
    fi

今天早些时候,我改进了它以在几本 iBooks 上运行,将“临时”文件放入本地目录,而不是写入 /tmp:

#!/bin/bash
# define output text file
OUTFILE='/Users/macadmin/batterysensortemp.txt'

# define email headers
SUBJECT="BATTERY TEMPERATURE EXCEEDED!"
RECIPIENTS="admin@domain.net"

# get the current battery sensor temperature and save it to a text file
/Users/macadmin/TemperatureMonitor.app/Contents/MacOS/tempmonitor -a -l | grep -i BATTERY > $OUTFILE

filecontent=(`cat $OUTFILE`)

temp1=`echo "${filecontent[1]}"|bc | sed 's/[.].*//'` #echo $temp1

if (( temp1 >= 33 )); then
    mail -s "$SUBJECT" $RECIPIENTS < $OUTFILE
fi

所以,转向 Linux,特别是 Xubuntu 12.04,我安装了 lm-sensors。运行“传感器”命令时,这是我得到的输出:

acpitz-virtual-0
Adapter: Virtual device
temp1:        +74.0°C  (crit = +103.0°C)
temp2:        +51.0°C  (crit = +115.0°C)
temp3:        +25.4°C  (crit = +103.0°C)

现在以前,我只需要处理一个小数点,所以在读取每一行输出后,sed 代码如下:

temp1=`echo "${filecontent[1]}"|bc | sed 's/[.].*//'`

但在这里我需要去掉 + 号、度数符号、大写字母 C 以及导致大写 A 的任何原因。我尝试过:

temp1=`echo "${filecontent[1]}"|bc | sed 's/[+.°C].*//'`

但我收到错误:

(standard_in) 1: syntax error
(standard_in) 1: illegal character: \302
(standard_in) 1: illegal character: \260

应该在 sed 脚本中添加什么来获得我想要的输出,即 740、510 和 254?还是我应该忘记编写自己的温度传感器通知脚本并找到其他东西(最终这就是它的用途)?

更新:有了这里的一些反馈,我在家用笔记本电脑上从头开始制作了一个新文件,运行 Sabayon 13.04:

#!/bin/bash

# define email headers
SUBJECT="LAPTOP SENSOR TEMPERATURE EXCEEDED!"
RECIPIENTS="john@net.net"

temp1=`sensors | grep -i temp3 | grep -o '+[0-9.]\+' | sed '1~2!d; s/+//'`
temp2=`echo "$temp1 * 10" | bc | sed 's/[.].*//'`

if (( temp2 >= 330 )); then
echo "EMAIL ALERT TRIGGERED!"
#mail -s "$SUBJECT" $RECIPIENTS < $OUTFILE 
fi  

变量 temp1 的结果为 24.0(摄氏度)。然后我可以将它乘以 10,得到 temp2 240,将其与 330 进行比较,因为它更凉爽,所以什么都不会触发。这也适用于 Xubuntu,无需修改!我认为我在垃圾字符方面遇到的问题可能归咎于 Windows 8 上的 Putty,而不是我在工作中使用的 Xubuntu 系统。谢谢大家的帮助和指点!

4

3 回答 3

1

这仅输出数字:

sensors | grep -o '+[0-9.]\+' | sed '1~2!d; s/+//'

grep 部分只打印前面的浮点数+,而 sed 部分删除每一行并删除+.

于 2013-05-24T20:58:50.107 回答
0

输出是 UTF-8 被解释为 ISO 8859-1;这就是°的来源。

使用sed,我可能会使用:

sed 's/^.*:[^0-9]*+\([0-9]*\)\.\([0-9]\).*/\1\2/'

该模式查找冒号之前的任何内容、一系列非数字、一个加号([-+]如果您可能正在处理冰冻温度,也可以选择用于查找负数),然后记住一系列数字,匹配一个点,并记住另一个数字,然后是任何内容;它用记住的数字代替它。

于 2013-05-24T21:19:47.797 回答
0

GNU sed

>sed -n '/^temp.*/s/[.].*//;s/+//p' 文件

温度1:74
温度2:51
温度3:25
于 2013-05-24T21:24:15.343 回答