Regex в Streamsets - PullRequest
       2

Regex в Streamsets

0 голосов
/ 05 октября 2018

Привет, я хочу разбить файл журнала, используя Streamsets.журнал похож на

Deny tcp src dmz:77.77.77.7/61112 dst dmz:55.55.56.57/139 by access-group "outside_access_in" [0x8b3ecfdc, 0x0]

В журнале также может быть более 2-х IP-адресов, и я пытаюсь получить только 1-й и 2-й IP-адреса из моего журнала.Написано, что Streamsets использует шаблоны Java REGEX.

То, что я делал до сих пор в процессоре Expression Evaluator в Streamsets, это:

${str:regExCapture(record:value('/Message'),'(\\d+[.]\\d+[.]\\d+[.]\\d+/?\\d*)', 1)}

Есть идеи, как захватить второй IP?

1 Ответ

0 голосов
/ 05 октября 2018

Вы можете использовать

${str:regExCapture(record:value('/Message'),'^(?:.*?(\\d+(?:[.]\\d+){3}(?:/\\d+)?)){2}', 1)}

См. Демоверсию regex .

Подробности

  • ^ - начало строки
  • (?:.*?(\\d+(?:[.]\\d+){3}(?:/\\d+)?)){2} - два последовательных вхождения
    • .*? - любые 0+ символов, кроме символов разрыва строки, как можно меньше
    • (\\d+(?:[.]\\d+){3}(?:/\\d+)?) - захват группы 1 (ее значение будет возвращено str:regExCapture, поскольку последний аргумент установлен на 1):
      • \\d+ - 1+ цифр
      • (?:[.]\\d+){3}- три вхождения . и 1+ цифр
      • (?:/\\d+)? - необязательная последовательность / и 1+ цифр.

Поскольку содержимое в группе перезаписывается, когда в одной операции сопоставления регистрируется несколько вхождений, группа 1 будет содержать только второе значение IP.

Обратите внимание, что лучше (безопаснее, точнее)Шаблон IP будет (?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\.(25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}, см. Извлечение IP-адресов из строк с использованием регулярных выражений .Таким образом, вы также можете написать команду как

 ${str:regExCapture(record:value('/Message'),'^(?:.*?\\b((?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)(?:\\.(?:25[0-5]|2[0-4]\\d|[0-1]?\\d?\\d)){3}(?:/\\d+)?)){2}', 1)}

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

...