
Я пытаюсь захватить текст с помощью регулярного выражения и заменить текст пользовательской строкой.
Мой текущий код успешно захватывает IP-адреса, но я не знаю, как заменить IP-адрес на пользовательский текст вместе с остальной частью сообщения:
$Template privateIP,"%TIMESTAMP% %HOSTNAME% %syslogtag% %msg:R,ERE,0,DFLT:([0-9]{1,3}\.){3}[0-9]{1,3}--end%\n"
Моя первая мысль - как-то вынести регулярное выражение из шаблона (например, с помощью RainerScript) и создать новое поле/переменную, modded_msg
которая будет установлена на измененное msg
свойство. А затем использовать %modded_msg%
в $Template.
Я пробовал несколько раз (спасибо, ChatGPT), но не смог заставить это работать.
решение1
В следующем примере можно проверить свойство msg на наличие IP-адреса, а затем заменить все его вхождения в сообщении некоторой строкой в зависимости от адреса.
set $.myip = re_extract($msg, "(([0-9]{1,3}\\.){3}[0-9]{1,3})", 0, 1, 0);
if ($.myip == 0) then set $.mymsg = $msg;
else{
if ($.myip=="192.1.2.3") then
set $.mymsg = replace($msg, $.myip, "SPECIALIP");
else
set $.mymsg = replace($msg, $.myip, "boringip");
}
template(name="mytemplate" type="string" string="%TIMESTAMP% %$.mymsg%\n")
action(type="omfile" file="output" template="mytemplate")
re_extract()
ищет регулярное выражение в свойстве. Обратите внимание на дополнительное, ()
чтобы мы могли извлечь группу захвата 1, все совпадение. Кроме того, удваивается \
. Последний параметр равен 0, возвращается при неудаче. Возвращенная строка сохраняется в локальной переменной $.myip
.
replace()
заменяет все вхождения строки в свойстве и возвращает результат в другой локальной переменной. Tempplace использует эту локальную переменную.