Regex для разделения строки процентов использования ЦП?

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

ОИД: .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 Custom String в PRTG, чтобы затем он мог оповещать, например, если среднее значение за 5 минут превышает 80%. Я сделал это регулярное выражение здесь: \d+(\%|\s\bpercent\b) через https://www.regextester.com/95112, но я также не могу понять, как изменить его для своих нужд, и не могу заставить его работать на regex101.com

Спасибо!

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

The fourth bird 10.12.2020 19:21
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
1
218
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

^\s*\d+\s+Secs\s*\(\s*(\d+(?:\.\d+)?%)\)\s+\d+\s+Secs\s+\(\s+(\d+(?:\.\d+)?%)\)\s+\d+\s+Secs\s+\(\s+(\d+(?:\.\d+)?%)\)$

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

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

cvocvo 10.12.2020 22:38

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

The fourth bird 10.12.2020 22:47

Другие вопросы по теме