LINUX.ORG.RU

grep возвращает пустое значение, но в конструкторе все работает

 , ,


0

2

Друзья,

Пытаюсь разобрать вывод от sensors, дабы получить температуру процессора. Вызываю так sensors -u.

Вывод оно дает вот такой вот:

Adapter: Virtual device
temp1:
  temp1_input: 26.800
  temp1_crit: 90.000

coretemp-isa-0000
Adapter: ISA adapter
Core 0:
  temp2_input: 57.000
  temp2_max: 105.000
  temp2_crit: 105.000
  temp2_crit_alarm: 0.000
Core 1:
  temp3_input: 57.000
  temp3_max: 105.000
  temp3_crit: 105.000
  temp3_crit_alarm: 0.000

При помощи вот такого вот выражения

/(?<=temp2_input: )\d+/
я получаю температуру в градусах нулевого ядра. Это выражение отлично работает в онлайн регэксп (например таком https://regex101.com/), но возвращает пустоту если запускать все это из-под Ubuntu 16 в терминале. И аналогично в скрипте:
Core1Temp=($(sensors -u | grep '/(?<=temp2_input: )\d+/'))
echo $Core1Temp

В результате получаю дулю. Подскажите, в каком месте я балбес?


У меня прокатило в таком виде:

> cat test.txt | grep -P '(?<=temp2_input: )\d+'
  temp2_input: 57.000
Во-первых, похоже, grep не требует слешей (я их видел только в perl как аналог кавычек для регулярок), во-вторых, выражение видимо использует что-то мудрёное и потребовалась поддержка perl-совместимых регулярных выражений, которая включается флагом -P.

(test.txt это куда я положил ваш вывод sensors)

sevenredlines
()
Последнее исправление: sevenredlines (всего исправлений: 1)
Ответ на: комментарий от anonymous

Я эту регулярку на сайте по ссылке выше проверил, результат другим должен быть, а именно - просто число, 57 в данном случае.

sevenredlines
()
Ответ на: комментарий от the_electric_hand
grep -P -o '(?<=temp2_input: )\d+'

Это тоже работает!

kvv213
() автор топика
Ответ на: комментарий от anonymous

А '(?<=string)' и 'string\K' это одно и то-же.

anonymous
()
$ echo "scale=1; $(cat /sys/class/hwmon/hwmon1/temp2_input) / 1000" | bc -l
43.0

$ sensors | grep 'Core 0'
Core 0:         +43.0°C  (high = +85.0°C, crit = +105.0°C)

Может кто подскажет как красявее (без bc) превратить 43000 в 43.0
Может кто подскажет как точно узнать путь до нужного tempX_input для нужного ядра. Оно не обязательно будет temp2 и не обязательно будет лежать в hwmon1. Я просто strace sensors посмотрел для своей системы.

Lavos ★★★★★
()
Последнее исправление: Lavos (всего исправлений: 1)
Ответ на: комментарий от anonymous

Если температура нужна в виде XX можно так:

echo $(( $(cat /sys/devices/platform/coretemp.0/hwmon/hwmon1/temp1_input) / 1000 ))

anonymous
()
Ответ на: комментарий от anonymous

По первому, чем тебя bc не устраивает?

Костылинг же.

По второму /sys/devices/platform/coretemp.0/hwmon/hwmonX/tempY_input не?

О, найс.

Lavos ★★★★★
()
Ответ на: комментарий от anonymous

/sys/devices/platform/coretemp.X/hwmon/hwmonY/tempZ_input где:

  • X — номер проца/сокета
  • Y — присвоенный номер для hwmon
  • Z — отдельное ядро/в целом проц (что именно можно посмотреть в файле tempZ_label
anonymous
()
Ответ на: комментарий от Lavos

$ echo "scale=1; $(cat /sys/class/hwmon/hwmon1/temp2_input) / 1000" | bc -l
Может кто подскажет как красявее (без bc) превратить 43000 в 43.0

А равно и без cat’а в подоболчке:

$ read t < /sys/class/hwmon/hwmon1/temp2_input
$ printf '%.1f\n' $((t / 1000))
Zmicier ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.