シェルスクリプトを使用して入力文字列に複数回現れる2つの単語間の最大値を抽出する方法

シェルスクリプトを使用して入力文字列に複数回現れる2つの単語間の最大値を抽出する方法

コマンド出力から最大温度値を抽出し、次のシェル変数に保存したいと思います。

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つです)。

たとえば、デバイスが1つしかない場合、最大温度はデバイス0の温度と同じでなければならず、そうでない場合は比較して印刷する必要があります。

編集1- 必ず使用する必要があるか、sedオプションawkgrep -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番目のフィールド()を確認します。$2値がこれまでの最大値より大きい場合、変数に保存されますmax(最初はゼロのように動作します)。

最後に見つかった最大値を印刷します。

関連情報