繁体   English   中英

基本的bash脚本awk和一个除法

[英]Basic bash script awk and a division

首先对这个基本问题感到抱歉。 但是我不是程序员,需要一些帮助。

我有一个命令可以给我传感器的温度。

例:

root@machine:~ $ snmpwalk 172.69.4.25 -v 2c -c rocommunity .1.3.6.1.3.1.1.4
iso.3.6.1.3.1.1.4.1.2.5.116.101.109.112.49.1 = STRING: "31625"

还有一个小的基本bashscript,只给我字符串的值。

#!/bin/bash
SLAVE="/sys/devices/w1_bus_master1/28-80000007e290/w1_slave"
OUTPUT=$(/bin/cat $SLAVE | /usr/bin/awk -F 't=' ' { printf $2 } ')
echo $OUTPUT

w1_slave文件如下

25 01 55 00 7f ff 0c 0c 08 : crc=08 YES
25 01 55 00 7f ff 0c 0c 08 t=31625

但这是一个温度,我需要一个/ 1000除法的值。 31625真正是31.625降级。

如果我放

#!/bin/bash
SLAVE="/sys/devices/w1_bus_master1/28-80000007e290/w1_slave"
OUTPUT=$(/bin/cat $SLAVE | /usr/bin/awk -F 't=' ' { printf $2 / 1000 } ')
echo $OUTPUT

给我吗

root@machine:~ $ /opt/scripts/gettemp.sh
031.625

结果是031.625,但我不知道为什么不只放31.625并删除前0,

我做错什么了吗? 有人可以帮我吗?

最好的问候

问题是您要在两行中打印$2值除以1000,然后使用printf这样做,而不会终止\\n

因此,从没有t=分隔符的第一个输入行开始,$ 2的值是NULL字符串,当您将其除以1000时,将得出数字输出0,但不会跟随换行符,因为您错误地使用了printf。

从第二行获得31.625的输出,但将其固定在生成0的同一行的末尾。

a)永远不要执行printf $2 (或任何其他包含输入数据的字段),而总是使用printf "%s", $2而是printf "%s", $2想象一下$2包含%s等printf格式字符时的区别。

b)除非您需要格式化,否则请使用print而不是printf

c)如果要用printf换行,则将它们包括在格式字符串中

d)如果您只想从匹配某些模式的输入线输出,请编写代码以执行该测试。

这可能是您真正想要的:

awk -F 't=' 'NF>1{print $2 / 1000}'

我仍然不知道问题中最初的snmpwalk代码段有什么用,并且将其余的shell脚本写成问题-不要对未导出的变量名使用大写字母,并且避免使用UUOC并引用变量:

#!/bin/bash
slave="/sys/devices/w1_bus_master1/28-80000007e290/w1_slave"
output=$(awk -F 't=' 'NF>1{print $2 / 1000}' "$slave")
echo "$output"

如果问题是awk格式,请尝试以下操作:

#!/bin/bash
SLAVE="/sys/devices/w1_bus_master1/28-80000007e290/w1_slave"
OUTPUT=$(/bin/cat $SLAVE | grep -o "t=.*" |  /usr/bin/awk -F 't=' ' { printf "%.3f",$2 / 1000 } ')
echo $OUTPUT

无论如何,正如@Ed Morton所说,默认情况下,awk默认不会填充零。 需要/ sys / devices / w1_bus_master1 / 28-80000007e290 / w1_slave文件的样本输出来澄清问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM