5

我是正则表达式的新手,但我认为这里的人们可能会给我有价值的输入。我正在使用logstashgrok过滤器,我只能在其中提供正则表达式。

我有一个这样的字符串

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

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

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

4

5 回答 5

6

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

/[^/]+/[^/]+/(?<field1>[^/]+)/
于 2014-03-22T02:42:30.227 回答
2

对于您的正则表达式:

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

您还可以通过以下方式进行测试: http ://www.regextester.com/

通过谷歌搜索正则表达式测试器,您可以拥有不同的 UI。

于 2012-11-23T05:27:56.477 回答
0

这就是我在 Perl 中的做法:

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

编辑:如果你的框架不支持 Perl-ish non-grouping groups (?:xyz),这个正则表达式应该可以代替:

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

如果您担心 的性能.*?,这也适用:

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

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

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

于 2012-11-23T05:29:04.480 回答
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
于 2012-11-23T05:35:00.023 回答
0

相同的答案,但修复了一个小错误。如果您在开始时未指定 ^,它将进行下一场比赛(尝试更长的路径添加更多 / 用于输入。)。要修复它,只需像这样在开头添加 ^ 。^ 表示输入行的开始。最后 group1 是你的答案。

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

如果您正在使用任何 URI 路径,请使用以下内容。(它将处理路径以及 URI)。

^.*?/[^/]+/[^/]+/([^/]+)/
于 2016-01-21T06:28:30.330 回答