Совпадение номера версии в гроке - PullRequest
2 голосов
/ 24 октября 2019

Я хочу разделить строку версии (например, 2.3.5) на три поля (major.minor.patch) с помощью фильтра grok.

Что я пробовал:

%{NUMBER:major}.%{NUMBER:minor}.%{NUMBER:patch}

Результат от Отладчик Grok : No Matches

enter image description here То, что я ожидал:

{
    major: 2,
    minor: 3,
    patch: 5
}

1 Ответ

1 голос
/ 24 октября 2019

Части номера версии имеют значения int , следовательно, имеет смысл использовать INT вместо NUMBER, что соответствует не только целочисленным значениям.

Кроме того,точка должна быть экранирована, чтобы соответствовать буквальной точке.

Использовать

%{INT:major}\.%{INT:minor}\.%{INT:patch}

Тест:

enter image description here

Подробнее:

Шаблоны доступны в хранилище logstash :

INT (?:[+-]?(?:[0-9]+))
BASE10NUM (?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))
NUMBER (?:%{BASE10NUM})

Итак, шаблон, полученный в результате ${NUMBER}..., равен

(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))).(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+))).(?<![0-9.+-])(?>[+-]?(?:(?:[0-9]+(?:\.[0-9]+)?)|(?:\.[0-9]+)))

и не соответствует входной строке , потому что атомная группа (?>...) соответствует точке как части числа с плавающей запятой и никогда не возвращает ее, так как обратное отслеживание не разрешено в атомарной группеузоры.

...