0

以下は、ftp ログからの行です。

2013-03-05 18:37:31 543.21.12.22 []送信済み /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256

正規表現の括弧内から値を取得し、それらの値を変数に設定する Simple Event Correlate というプログラムを使用しています。

したがって、前のログ ファイル行で動作するはずの SEC 構成ファイルのエントリを次に示します。

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)

これは、ログインしているユーザーを引き出してcourt-9746hd変数に設定することには成功しますが、ダウンロードしたファイル名を適切に抽出することはできません。または、Chairman-confidential-video.mpeg

代わりに、次のようにダウンロードされたファイルを引き出します。Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256

ご覧のとおり、ファイル名の後の最初の空白で 2 番目の抽出を停止するのに苦労しています。私はもう試した:

    pattern=sent \/home\/mydomain\/public_html\/(.*)\/(.*)\s

しかし、私は同じ結果しか得られません。どんな助けでも大歓迎です。

4

3 に答える 3

2

非空白のみに一致させたい場合は、またはに置き換え.*ます。\S*除外したい文字がスペースだけの場合は、[^ ]*代わりに使用します。

また、man perlre参考になります。

于 2013-03-07T03:42:33.940 に答える
0

1つのオプションは、最初に行からフルパスをキャプチャしてから、File::Specを使用してユーザーとファイルの情報を取得することです。

use strict;
use warnings;
use File::Spec;

my $line = '2013-03-05 18:37:31 543.21.12.22 []sent /home/mydomain/public_html/court-9746hd/Chairman-confidential-video.mpeg 226 court-9746hd@mydomain.com 256';
my ( $path ) = $line =~ m!\s+(/home\S+)\s+!;
my ( $user, $file ) = ( File::Spec->splitdir($path) )[ -2, -1 ];

print "User: $user\nFile: $file";

出力:

User: court-9746hd
File: Chairman-confidential-video.mpeg

ただし、正規表現のみを使用する場合は、次のように機能します。

m!/home/.+/.+/([^/]+)/(\S+)!
于 2013-03-07T04:19:08.970 に答える
0

.* コンストラクトを使用するのではなく、原則として、スコープの狭いものを使用してください。この場合、必要なのは空白ではないものなので、明示的に言ってください:

pattern=sent \/home\/mydomain\/public_html\/([^\s]+)\/([^\s]+)
于 2013-03-07T03:44:11.787 に答える