2012-11-23 12 views
5

我是新来的正则表达式,但我认为这里的人可能会给我有价值的输入。我正在使用logstash grok过滤器,其中我只能提供正则表达式。使用logstash grok过滤器提取部分文件路径的正则表达式

我有这样

/app/webpf04/sns882A/snsdomain/logs/access.log 

我想用正则表达式来获得sns882A部分从字符串,这是之后的第三个“/”的子字符串,我该怎么办呢?

我只限于正则表达式,因为grok只接受正则表达式。有没有可能为此使用正则表达式?

回答

2

为您的正则表达式:

/\w*\/\w*\/(\w*)\/ 

您还可以测试: http://www.regextester.com/

谷歌搜索正则表达式测试仪,你可以有不同的UI。

+0

From http://www.regextester。com /它给了我没有匹配,我尝试http://gskinner.com/RegExr/没有结果,以及... – flyasfish

+0

此解决方案依赖总是由字母数字字符或下划线组成的目录和文件名称。特别地,在路径 – Borodin

+0

的任何地方可能没有空格,匹配是基于索引0的。你也可以看到:1:(sns882A),这意味着它是第一场比赛。 – junky

0

这是我会怎么做它用Perl:

my ($name) = ($fullname =~ m{^(?:/.*?){2}/(.*?)/}); 

编辑: 如果你的框架不支持Perl的十岁上下的非分组组(?:xyz),这个正则表达式应该改为工作:

^/.*?/.*?/(.*?)/ 

如果您关注的是.*?的性能,那么也可以这样工作:

^/[^/]+/[^/]+/([^/]+)/ 

一注:上面的所有正则表达式都会匹配字符串/app/webpf04/sns882A/

但匹配字符串与第一个匹配组完全不同,在所有三种情况下都是sns882A

+0

当我尝试^(?:/.*?){2} /(。*?)/ part在http://gskinner.com/RegExr/时,它与/ app/webpf04/sns882A/ – flyasfish

+0

相匹配它在Perl或Python?我做了,它确实有效 – mvp

+0

你应该使用'(?:/ [^ /] *)'。否则你的正则表达式可能需要很长的时间才能决定它不匹配 – Borodin

0

如果你确实使用Perl,那么你应该使用File::Spec模块这样

use strict; 
use warnings; 

use File::Spec; 

my $path = '/app/webpf04/sns882A/snsdomain/logs/access.log'; 
my @path = File::Spec->splitdir($path); 

print $path[3], "\n"; 

输出

sns882A 
+0

我不能使用任何语言,这是logstash-grok配置的一部分,我只能提供表达式。 – flyasfish

5

是的,你可以使用正则表达式让你通过神交想要的东西:

/[^/]+/[^/]+/(?<field1>[^/]+)/ 
+0

我知道这个答案太晚了,但无论如何+1作为第一个*正确*答案也就是说,一个独立的正则表达式(没有其他代码和分隔符),它使用命名捕获的部分它应该提取。 –

0

相同的答案,但一个小错误修复。如果你没有在开始时指定^,那么它将进入下一个匹配(尝试更长的路径添加更多/输入。)。要解决它只需在这样的开始加^。 ^表示开始输入行。最后group1是你的答案。

^/[^/]+/[^/]+/([^/]+)/ 

如果您使用的是任何URI路径,请在下面使用(它将处理路径和URI)。

^.*?/[^/]+/[^/]+/([^/]+)/