从右外壳脚本计算字符

时间:2013-12-21 00:07:00

标签: shell awk raspberry-pi

我有一个连接到* nix系统的温度传感器,典型的输出类似于:

pi@raspberrypi $ cat /sys/bus/w1/devices/28-00000202070c/w1_slave
c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187

结果没有任何逗号,但假设在逗号后总是带有3位数,所以在这个例子中将是12.187º。

我已经实现了一个过滤器,它在第二个char之后放置一个逗号,它大部分时间都可以运行:

grep t= | awk '{print $10;}'|  sed 's/t\=//g' | sed 's/\([0-9][0-9]\)\([0-9]\)/\1,\2/g'

然而,在冬季,温度降至10º以下,我的过滤器返回值为95,32º(当它应为9,532º时)。

有没有办法从右边计算字符,所以我总是可以计算3个数字字符(并避免在10º以下的温度下出现这个问题)?

谢谢, Joaoabs

4 个答案:

答案 0 :(得分:1)

可以处理浮点运算:

awk '/t=/ { sub(/t=/,"",$NF); print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave

答案 1 :(得分:1)

如果我理解正确,那么你想要做的是:

sed 's/\([0-9][0-9][0-9]\)$/,\1/g'
正则表达式中的

$表示“结束”,因此这会在字符串末尾搜索3位数字,并将其替换为逗号+找到的数字

(注意:这应该是管道的最后一部分,开头不变。)

答案 2 :(得分:1)

使用awk

awk -F= '/t=/ {print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave
12.187

或将其存储到变量:

temp=$(awk -F= '/t=/ {print $NF/1000}' /sys/bus/w1/devices/28-00000202070c/w1_slave)
echo "$temp"
12.187

答案 3 :(得分:0)

不要grep|awk|sed|sed...,请尝试:

...|awk -F't=' -v OFS='t=' 'NF>1{$2=sprintf("%'\''d",$2)}7'

使用您的数据进行测试:

kent$  echo "c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187"|awk -F't=' -v OFS='t=' 'NF>1{$2=sprintf("%'\''d",$2)}7'
c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12,187

awk在'printf'中有您的要求的格式模式。只是使用它。

如果您只想获得t =值

awk -F't=' -v OFS='t=' 'NF>1{printf "%'\''d\n",$2}' 

使用相同的输入:

kent$  echo "c3 00 4b 46 7f ff 0d 10 12 : crc=12 YES
c3 00 4b 46 7f ff 0d 10 12 t=12187"|awk -F't=' -v OFS='t=' 'NF>1{printf "%'\''d\n",$2}'                                                                                     
12,187