我是正则表达式的新手,但我认为这里的人可能会给我宝贵的意见。我正在使用logstash grok
过滤器,我只能在其中提供正则表达式。
我有一个像这样的字符串
/app/webpf04/sns882A/snsdomain/logs/access.log
我想使用正则表达式从字符串中获取sns882A
部分,这是第三个“/”之后的子字符串,我该怎么做?
我被限制为正则表达式,因为grok只接受正则表达式。是否可以使用正则表达式?
答案 0 :(得分:6)
是的,你可以使用正则表达式通过grok获得你想要的东西:
/[^/]+/[^/]+/(?<field1>[^/]+)/
答案 1 :(得分:2)
答案 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)。
^.*?/[^/]+/[^/]+/([^/]+)/