如何使用shell脚本从输入字符串中提取多次出现的2个单词之间的值中的最大值

如何使用shell脚本从输入字符串中提取多次出现的2个单词之间的值中的最大值

我想从命令的输出中提取最大温度值,并将其存储在 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 0Device 1信息
  • 有时 Device 0,,,信息Device 1Device 3Device 4

因此,无论设备数量如何,查找最大温度逻辑都应该是通用的(尽管最大计数为 4,但可用设备的最小计数为 1)。

例如,如果仅存在一个设备,则最大温度应等于设备 0 温度,否则我们需要比较并打印。

编辑1- 我需要使用sedawk作为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)。

最后,打印找到的最大值。

相关内容