繁体   English   中英

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

[英]Regular expression to extract part of a file path using the logstash grok filter

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

我有这样的字符串

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

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

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

是的,您可以使用正则表达式通过grok获得您想要的内容:

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

为你的正则表达式:

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

您还可以使用以下网址进行测试: http//www.regextester.com/

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

这就是我在Perl中的表现:

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

编辑 :如果您的框架不支持Perl-ish非分组(?:xyz) ,则此正则表达式应该可以正常工作:

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

如果你担心.*?表现.*? ,这也有效:

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

还有一点需要注意:上面的所有正则表达式都匹配string /app/webpf04/sns882A/

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

如果你确实在使用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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM