Регулярное выражение для разделения строки процентов использования ЦП?

#regex #prtg

#регулярное выражение #prtg

Вопрос:

У нас есть коммутатор HP 1920S, и единственный способ получить информацию об использовании ЦП через SNMP — это OID, который я нашел здесь: https://community.hpe.com/t5/Web-and-Unmanaged/HP-1920s-OID-CPU-Utilization-and-memory/td-p/7001413

OID: .1.3.6.1.4.1.11.5.7.5.7.1.1.1.1.4.9.0

При запросе через SNMP этот OID возвращает такие значения:

  5 Secs ( 22.3463%) 60 Secs ( 25.677%) 300 Secs ( 21.3522%)
 5 Secs ( 13.6713%) 60 Secs ( 15.3520%) 300 Secs ( 15.9640%)
 

Таким образом, среднее значение загрузки ЦП за 5 секунд составляет 22%, 60 секунд — 25%, а 5 минут — 21%. Затем в следующий раз, когда я запрашивал, это было 13, 15 и 15 процентов.

Есть ли способ с помощью регулярного выражения дискретно сопоставить 5-секундный процент или дискретно сопоставить 60-секундный процент или 5-минутный процент? Цель состоит в том, чтобы подключить это к нескольким настраиваемым строковым датчикам SNMP в PRTG, чтобы затем он мог предупреждать, например, если среднее значение за 5 минут превышает 80%. Я отлично справился с этим регулярным выражением здесь: d (%|sbpercentb) через https://www.regextester.com/95112 но я также не могу понять, как изменить его для своих нужд, и не могу заставить его работать дальше regex101.com

Спасибо!

Комментарии:

1.Вы можете создать полный шаблон и использовать 3 группы захвата для всех процентов. Например: ^s*d s Secss*(s*(d (?:.d )?%))s d s Secss (s (d (?:.d )?%))s d s Secss (s (d (?:.d )?%))$ regex101.com/r/8PqwXK/1

Ответ №1:

Использование d (%|sbpercentb) не будет соответствовать десятичной части в строке примера.

Вы могли бы добавить соответствие необязательной десятичной части d (?:.d )?(?:%|sbpercentb) , но вы получите 3 совпадения, а шаблон не совпадает Secs

Ваш запрос вернул 2 раза одну и ту же структуру данных. Одним из способов может быть использование шаблона, соответствующего полной строке, и использование 3 групп захвата, чтобы вы знали, какая группа имеет какое значение.

В данных примера нет слова percentage , поэтому вы могли бы просто использовать % вместо этого.

 ^s*d s Secss*(s*(d (?:.d )?%))s d s Secss (s (d (?:.d )?%))s d s Secss (s (d (?:.d )?%))$
 

Демонстрация регулярных выражений

Комментарии:

1. Спасибо; как вы разделяете это, чтобы создать регулярное выражение для значения 5 секунд, одно для значения 60 секунд и одно для значения 300 секунд?

2. @cvocvo Вы могли бы сделать это, используя квантификатор {n} , например ^(?:s*d s Secss*(s*(d (?:.d )?%))) , для получения первого или ^(?:s*d s Secss*(s*(d (?:.d )?%))){2} для получения второго и т. Д regex101.com/r/6hszTy/1 или ^(?:s*d s Secss*(s*(d (?:.d )?%))){3} получить третий regex101.com/r/52gN8w/1 и во всех 3 случаях значение находится в группе захвата 1.