尝试使用sed将温度从传感器命令转换为数字

时间:2013-05-24 20:47:47

标签: ubuntu sed

我有一个脚本,我是使用'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

今天早些时候,我将它改进为在几本iBook上运行,将“temp”文件放入本地目录,而不是写入/ 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。运行“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系统。感谢大家的帮助和指点!

3 个答案:

答案 0 :(得分:1)

这只输出数字:

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

grep部分仅打印前面带有+的浮动数字,而sed部分删除每一行,并删除+

答案 1 :(得分:0)

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

使用sed,我可能会使用:

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

模式查找冒号,一系列非数字,一个加号(可选择使用[-+]来查找负数,如果你可以处理冰点温度),然后记住一个数字序列,匹配一个点,并记住另一个数字,然后是任何数字;它用记住的数字代替它。

答案 2 :(得分:0)

GNU sed

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

temp1:        74
temp2:        51
temp3:        25