簡體   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