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)}
Смотрите другую демонстрацию регулярных выражений.