Извлечение и обработка информации о производительности GPUT с использованием Regexp

Мне нужно извлечь и обработать значение температуры графической карты целым следующим выходом из приложения Linux Ubuntu, датчики:

amdgpu-pci-0c00 Adapter: PCI adapter fan1: 1972 RPM temp1: +50.0°C (crit = +0.0°C, hyst = +0.0°C) amdgpu-pci-0600 Adapter: PCI adapter fan1: 1960 RPM temp1: +47.0°C (crit = +0.0°C, hyst = +0.0°C) amdgpu-pci-0200 Adapter: PCI adapter fan1: 1967 RPM temp1: +52.0°C (crit = +0.0°C, hyst = +0.0°C) pch_skylake-virtual-0 Adapter: Virtual device temp1: +33.0°C amdgpu-pci-0900 Adapter: PCI adapter fan1: 1893 RPM temp1: +51.0°C (crit = +0.0°C, hyst = +0.0°C) amdgpu-pci-0300 Adapter: PCI adapter fan1: 1992 RPM temp1: +53.0°C (crit = +0.0°C, hyst = +0.0°C) coretemp-isa-0000 Adapter: ISA adapter Package id 0: +24.0°C (high = +80.0°C, crit = +100.0°C) Core 0: +23.0°C (high = +80.0°C, crit = +100.0°C) Core 1: +21.0°C (high = +80.0°C, crit = +100.0°C) 

Предположим, я хочу извлечь информацию, которая ассоциируется с температурой amd gpu, которая равна 50, 47, 52, 51 и 53. До сих пор у меня есть следующий код:

 sensors|grep temp| grep -Eo '\+[0-9]{0,9}' 

и я получил:

 +50 +0 +0 +47 +0 +0 +52 +0 +0 +32 +51 +0 +0 +53 +0 +0 

Поэтому мне нужно выяснить это:

  1. Представление regexp look-around, чтобы оно фиксировало целые числа, которые имеют знак + в начале номера, без отображения знака + (плюс).
  2. Способ захватить только информацию amdgpu, чтобы он не захватил другую информацию.
  3. Способ обработки этих температурных чисел, например, я мог бы написать сценарий bash для обработки чисел, тогда как если температура меньше 30, сделайте это, если более 70, сделайте это. Должен ли я помещать результат в массив и делать цикл, или есть ли другой практический способ?

Пожалуйста помоги. С уважением

Там у вас есть желаемые температуры, хранящиеся в массиве, после чего вы можете выполнить математику с ними.

arr=( $( IFS=$'\n' gawk 'BEGIN{ RS="\n\n"} { if($0 ~ /amdgpu/) print $0 }' test.txt | gawk 'BEGIN{ FS="[+.]" } { if($1 ~ /temp1:/) print $2 }' ) ) echo "${arr[*]}" 50 47 52 51 53

test.txt содержит ваш образец вывода. Получение ввода от команды датчиков (не проверено)

arr=( $( sensors | IFS=$'\n' gawk 'BEGIN{ RS="\n\n"} { if($0 ~ /amdgpu/) print $0 }' | gawk 'BEGIN{ FS="[+.]" } { if($1 ~ /temp1:/) print $2 }' ) ) echo "${arr[*]}" 50 47 52 51 53

Вы также можете получить temps с одним grep, если вы хотите использовать Perl-подобное regexp:

 sensors | grep -oP 'temp\d:\s+\+\K\d+' 

Где мы grep для temp за которым следует цифра и двоеточие, затем по крайней мере один символ пробела и знак плюса, после этого мы даем утверждение lookbehind \K которое отбрасывает все до него, а окончательный захват – это просто \d+ ( одна или несколько цифр).