从数据bash中提取温度

时间:2014-06-24 23:15:12

标签: bash parsing awk grep

我正在使用来自温度监视器的命令行工具,即mac软件,如下所示:

$ /Applications/TemperatureMonitor.app/Contents/MacOS/tempmonitor -c -l -a


SMART Disk Hitachi HTS547550A9E384 (J2250050GMBY3C): 30 C
SMART Disk TOSHIBA MK5065GSXF (71SNCPW4T): 28 C
SMC BATTERY: 30 C
SMC BATTERY POSITION 2: 31 C
SMC BATTERY POSITION 3: 28 C
SMC CPU A DIODE: 47 C
SMC CPU A PROXIMITY: 45 C
SMC GPU 1 CHIP: 40 C
SMC LEFT PALM REST: 28 C
SMC MAIN HEAT SINK 2: 38 C
SMC MAIN HEAT SINK 3: 37 C
SMC MAIN LOGIC BOARD: 36 C
SMC PLATFORM CONTROLLER HUB: 49 C
SMC SSD BAY: 36 C

我想稍微清理一下。例如,假设我想获得三个电池温度读数的平均值。我想到为grep拨打电池,然后awk通过所有字段获取正确的数据,但这看起来非常混乱。

所以我希望三个变量$ BATTERY_1,$ BATTERY_2和$ BATTERY_3分别拥有内容30,31和28。

有关最干净方法的任何建议吗?

2 个答案:

答案 0 :(得分:3)

创建数组然后将数组中的值移动到普通变量会更容易。使用awk

进行提取是微不足道的
TEMPMON="/Applications/TemperatureMonitor.app/Contents/MacOS/tempmonitor"
battery=( $("$TEMPMON" -c -l -a | awk '/BATTERY/ { print $(NF-1) }') )
BATTERY_1=${battery[0]}
BATTERY_2=${battery[1]}
BATTERY_3=${battery[2]}

答案 1 :(得分:3)

补充@Jonathan Leffler's helpful answer

如果您实际上并不需要个别值,而是只想要平均值,请尝试:

... | awk '/ BATTERY/ {sum+=$(NF-1); ++i} END {OFMT="%.2f"; print sum / i}'
  • OFMT="%.2f"将(printf样式)输出数字格式设置为2位小数,结果为29.67

更新:OP在评论中要求格式为<Item name>: <avg temp> (<temp 1>, <temp 2>, <temp 3>)输出:

... | awk -v itm='BATTERY' '
  $0 ~ itm {
    vals = vals (i ? " " : "") $(NF-1)
    sum += $(NF-1); ++i
  } 
  END {
    printf "%s: %.2f (%s)\n", itm, sum / i, vals
  }'
  • -v itm='BATTERY'将要匹配的项目名称作为awk变量itm传递。
  • $0 ~ itm将当前输入行(~)与$0匹配(itm)(解释为正则表达式,在此简单情况下执行子字符串匹配)。
  • awk默认情况下按空格将输入行拆分为字段$1$2,...,并将字段数存储在特殊变量NF中。由于输入数据中的值位于倒数第二个字段中,$(NF-1)引用每一行的值。
  • vals = ...建立匹配值的字符串列表;注意如何仅将字符串和变量放在一起使它们连接起来(作为字符串)。
    • (i ? " " : "")是一个C风格的三元条件,如果条件i为真,则返回单个空格(即,如果变量i具有非零值),否则为空字符串。换句话说:如果值不是 first ,则在将值附加到目前为止构建的值列表之前附加一个空格。请注意,awk中的未初始化变量在字符串上下文中默认为空字符串,在数字/布尔上下文中默认为0(false)。
  • sum += ...总结了价值观; ++i保留了值的数量。
  • END是一种特殊模式,其关联的操作(块)在所有输入行之后处理。
  • printf,对于基于格式(模板)字符串的输出,其作用类似于C对应物,在这种情况下输出项目名称(1st %s,用itm实例化) ,平均值为2位小数(%.2f,用sum / i实例化)和值列表(最后%s,用vals实例化)。