基本的bash脚本awk和一个部门

时间:2016-07-21 13:11:05

标签: linux bash awk debian printf

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

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

示例:

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 个答案:

答案 0 :(得分:2)

问题是您从两行打印$2值除以1000并使用printf执行此操作而没有终止\n

因此,从没有t=分隔符的第一个输入行,$ 2的值是NULL字符串,当你除以1000时会得到数字输出0但由于你错误地使用printf而没有后跟换行符

从你的第二行你得到输出31.625,但它被固定在与产生0的行相同的末尾。

a)永远不要printf $2(或包含输入数据的任何其他字段),而是始终printf "%s", $2 - 想象$2包含printf格式字符%s时的区别

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"

答案 1 :(得分:0)

如果问题是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文件的示例输出来澄清问题。