Как получить только первое совпадение с фильтром регулярных выражений Grok - PullRequest
2 голосов
/ 06 марта 2020

цель

Я хочу получить только эту строку "14" из этого сообщения с logsta sh Grok

3/03/0 EE 14 GFR 20 AAA XXXXX 50 3365.00

это мой код grok

grok{
 match => {
        field1 => [
          "(?<number_extract>\d{0}\s\d{1,3}\s{1})"       
        ]         
      }
}

Я хотел бы сопоставить только первое совпадение "14", но мой фильтр Grok возвращает все совпадения:

14 20 50

1 Ответ

2 голосов
/ 06 марта 2020

Если вам нужно найти первое вхождение числа, которое состоит только из 1, 2 или 3 цифр, вы можете использовать

^(?:.*?\s)?(?<number_extract>\d{1,3})(?!\S)

Подробности

  • ^ - начало строки
  • (?:.*?\s)? - необязательная подстрока из любых 0+ символов, кроме символов разрыва строки, как можно меньше, а затем пробел (это разрешает совпадение в начале строки, если она там есть)
  • (?<number_extract>\d{1,3}) - от 1 до 3 цифр
  • (?!\S) - отрицательный прогноз, обеспечивающий наличие пробела или конца строки непосредственно справа (разрешает сопоставление в конце строки).

Альтернативное решение

Если вы знаете, что искомое число находится после даты- например, поле и другое поле, и вы хотите принудительно выполнить предварительную проверку, вы можете использовать

^\d+/\d+/\d+\s+\S+\s+(?<number_extract>\d+)

См. демонстрационную версию regex

Если вам не нужно чтобы проверить, является ли первое поле похожим на дату, вы можете просто использовать

^\S+\s+\S+\s+(?<number_extract>\d+)
^(?:\S+\s+){2}(?<number_extract>\d+) // Equivalent

См. демонстрацию регулярных выражений здесь .

Подробности

  • ^ - начало строки
  • \d+/\d+/\d+ - 1+ цифр, /, 1+ цифр, /, 1+ цифр
  • \s+ - 1+ пробелов
  • \S+ - 1+ символов, кроме пробелов
  • \s+ - 1+ пробелов
  • (?<number_extract>\d+) - Группа захвата "number_extract": 1+ цифр.

Демонстрация Grok:

enter image description here

...