Perl 正则表达式

Perl 正则表达式

我有由服务器日志文件生成的以下字符串。我正在使用简单事件相关器(使用 perl 正则表达式)来处理行:

18:37:31 643.65.123.123 []sent /home/mydomain/public_html/court-954fdw/Chairman-confidential-video.mpeg 226 [email protected] 256

并且我已经成功使用 perl regex 成功提取使用以下模式登录的用户。

笔记:SEC 使用的值是从括号内的数据中提取的:

pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)

但是,我无法解析出文件名,在本例中是:Chairman-confidential-video.mpeg

目前,我使用的现有模式会拉出整个字符串:

Chairman-confidential-video.mpeg 226 [email protected] 256

我不想要。任何帮助都非常感谢。

答案1

我可能会使用:

pattern=sent \/home\/mydomain\/public_html\/(.*)\/(\S+).*

这应该提取出最后一个捕获匹配的除空格字符之外的所有字符,并将其余字符留给非捕获匹配。

答案2

我将使用以下内容:

pattern=sent \/home\/mydomain\/public_html\/(.*?)\/\(.* ?)\S*.*$

为了更明确的非贪婪匹配。您的结果现在将在 $2 中。这假设您不能在 public_html 下硬编码任何内容。这会留下尾随空格。

答案3

其他答案假设文件名中没有空格,这是一个相当冒险的假设。更安全的做法是假设文件名中没有斜杠,因为这在 Linux 中是非法的:

pattern=sent \/home\/mydomain\/public_html\/([^\/]+)\/([^\/]+) [0-9]+ \S+@\S+ [0-9]+$

测试地点https://regex101.com/

相关内容