5

私は正規表現を初めて使用しますが、ここの人々は貴重な情報を提供してくれると思います。grok正規表現のみを指定できるlogstash フィルターを使用しています。

私はこのような文字列を持っています

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

sns882A正規表現を使用して、文字列から 3 番目の "/" の後の部分文字列を取得したいのですが、どうすればよいですか?

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風の非グループ化グループをサポートしていない場合(?:xyz)、この正規表現は代わりに機能するはずです:

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

のパフォーマンスが心配な場合は.*?、これも機能します。

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

もう1つの注意:上記のすべての正規表現は文字列と一致します/app/webpf04/sns882A/

sns882Aただし、一致する文字列は、3つのケースすべてにある最初の一致するグループとは完全に異なります。

于 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 に答える