我有以下由服务器日志文件生成的string。 我正在使用简单事件相关(使用perl正则expression式)来操纵行:
18:37:31 643.65.123.123 []sent /home/mydomain/public_html/court-954fdw/Chairman-confidential-video.mpeg 226 [email protected] 256
我已经成功地使用perl正则expression式成功地提取用以下模式login的用户。
注: SEC使用的值是从括号中的数据中提取的:
pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)
但是,在parsing这个文件名时,我一直没有成功,在这种情况下,这个文件名是: Chairman-confidential-video.mpeg 。
目前,我使用的现有模式拉出整个string:
Chairman-confidential-video.mpeg 226 [email protected] 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]+$