У меня есть следующая строка, созданная файлом журнала сервера. Я использую простой коррелятор событий (который использует регулярное выражение perl) для управления строками:
18:37:31 643.65.123.123 []sent /home/mydomain/public_html/court-954fdw/Chairman-confidential-video.mpeg 226 court-954fdw@mydomain.com 256
и мне удалось использовать регулярное выражение Perl для успешного извлечения пользователя, который входит в систему по следующему шаблону.
НОТА: значения, которые использует SEC, извлекаются из данных, содержащихся в скобках:
pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)
Однако мне не удалось разобрать только имя файла, которое в этом случае будет: Chairman-confidential-video.mpeg
.
В настоящее время существующий шаблон, который я использую, вытягивает всю строку:
Chairman-confidential-video.mpeg 226 court-954fdw@mydomain.com 256
чего я не хочу. Любая помощь очень ценится.
Я бы, наверное, использовал:
pattern=sent \/home\/mydomain\/public_html\/(.*)\/(\S+).*
Это должно извлечь все символы, кроме пробелов, для последнего совпадения захвата, а остальные оставить для совпадения без захвата.
Я бы использовал следующее:
pattern=sent \/home\/mydomain\/public_html\/(.*?)\/\(.* ?)\S*.*$
Для более явного нежадного сопоставления. Теперь ваш результат будет в 2 доллара. Это предполагает, что вы не можете жестко кодировать что-либо ниже public_html. Это оставляет конечное пространство.
Другие ответы не предполагают пробелов в имени файла, что является довольно рискованным предположением. Более безопасная ставка - не использовать косую черту в имени файла, поскольку это недопустимо в Linux:
pattern=sent \/home\/mydomain\/public_html\/([^\/]+)\/([^\/]+) [0-9]+ \S+@\S+ [0-9]+$
Проверено на https://regex101.com/