正则表达式,使用logstash grok过滤器提取文件路径的一部分

时间:2012-11-23 05:20:24

标签: regex logstash logstash-grok

我是正则表达式的新手,但我认为这里的人可能会给我宝贵的意见。我正在使用logstash grok过滤器,我只能在其中提供正则表达式。

我有一个像这样的字符串

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

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

我被限制为正则表达式,因为grok只接受正则表达式。是否可以使用正则表达式?

5 个答案:

答案 0 :(得分:6)

是的,你可以使用正则表达式通过grok获得你想要的东西:

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

答案 1 :(得分:2)

为你的正则表达式:

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

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

通过谷歌搜索正则表达式测试程序,您可以拥有不同的用户界面。

答案 2 :(得分:0)

这就是我在Perl中的表现:

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

修改: 如果您的框架不支持Perl-ish非分组组(?:xyz),则此正则表达式应该起作用:

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

如果您担心.*?的效果,也可以这样做:

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

还有一个注意事项:上面的所有正则表达式都匹配字符串/app/webpf04/sns882A/

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

答案 3 :(得分: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

答案 4 :(得分:0)

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

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

如果您正在使用下面的任何URI路径。(它将处理路径以及URI)。

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