Regex в Streamsets

Привет, я хочу сломать файл журнала, используя 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)}

Есть идеи как захватить 2-й IP?

1 ответ

Решение

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

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

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

подробности

  • ^ - начало строки
  • (?:.*?(\\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)}

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

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