我想从命令的输出中提取最大温度值,并将其存储在 shell 变量中,如下所示:
res="$(get temperature all)"
结果看起来像
Device 0 avs data:
Temperature: 33.5 C
voltage1V0: 0.926 V
voltage1V8: 1.782 V
voltage3V3: 3.265 V
Device 1 avs data:
Temperature: 32.6 C
voltage1V0: 0.923 V
voltage1V8: 1.780 V
voltage3V3: 3.265 V
Device 2 avs data:
Temperature: 33.1 C
voltage1V0: 0.920 V
voltage1V8: 1.785 V
voltage3V3: 3.290 V
Device 3 avs data:
Temperature: 33.1 C
voltage1V0: 0.921 V
voltage1V8: 1.780 V
voltage3V3: 3.265 V
Temperature:
我想提取字符串和之间的数值C
,并从所有设备记录中找到最大值。对于上述情况,输出应该是
33.5
因为温度值为 33.5、32.6、33.1、33.1
在上面的命令中,输出给出
- 有时只是
Device 0
信息, - 有时
Device 0
,Device 1
信息 - 有时
Device 0
,,,信息Device 1
Device 3
Device 4
因此,无论设备数量如何,查找最大温度逻辑都应该是通用的(尽管最大计数为 4,但可用设备的最小计数为 1)。
例如,如果仅存在一个设备,则最大温度应等于设备 0 温度,否则我们需要比较并打印。
编辑1- 我需要使用sed
或awk
作为grep -P
选项不可用。
echo 'Here is a string, and Here is another string.' | grep -oP '(?<=Here).*(?=string)'
grep: invalid option -- 'P'
答案1
假设每个设备都可以包含只有一个“温度”读数,并且您只对打印最大值(而不是相关的设备编号)感兴趣,您可以尝试以下操作:
awk '$1=="Temperature:" {if ($2>max) max=$2} END{printf("Maximum: %.1f\n",max)}'
这将解析第一个空格分隔字段 ( $1
)为 的所有行Temperature:
,并检查第二个字段($2
,它是数字温度值)。如果该值大于目前为止的最大值,则将其存储在变量中max
(其行为就像最初为 0)。
最后,打印找到的最大值。