3

私はまだ正規表現を学んでおり、長い道のりがあるので、正規表現の経験が豊富な方からの助けをいただければ幸いです。複数のログ ファイルを解析し、特定の値を解析するための perl スクリプトに取り組んでいます。この場合、ユーザー名のリストを取得しようとしています。

ログファイルは次のようになります。

  [date timestamp]UserName = Joe_Smith
  [date timestamp]IP Address = 10.10.10.10

..

テストだけで、を使用して引き出すことができましたが\UserName\s\=\s\w+、実際の UserName 値が必要であり、「UserName =」部分は含めません。理想的には、これを機能させることができれば、IP アドレスなどを引き出すために同じロジックを適用できるはずですが、今のところユーザー名のリストを取得したいと思っています。

また、ユーザー名は常に上記の形式でFirstname_Lastnameあるため、 \w+ は常に必要なものをすべて取得する必要があると思います。

どんな助けにも感謝します!

4

3 に答える 3

5

正規表現で括弧を使用して、一致した文字列の関心のある部分をキャプチャする必要があります。

$1一致が成功した場合、組み込み変数$2などでキャプチャが使用可能になり、正規表現で左括弧が表示される順序で番号が付けられます。

この場合、必要なキャプチャは 1 つだけなので、 だけを見る必要があります$1

キャプチャ変数の値を使用する前に、正規表現の一致が成功したことを常に確認する必要があることに注意してください。キャプチャ変数は、最後に成功した一致の値を保持し、一致に失敗してもリセットされないためです。

use strict;
use warnings;

my $str = '[date timestamp]UserName = Joe_Smith';

if ($str =~ /UserName = (\w+)/) {
  print $1, "\n";
}

出力

Joe_Smith
于 2012-12-17T03:04:31.887 に答える
2

それを行う別の方法:

my ($username) = $str =~ /UserName\s\=\s(\w+)/
    or warn "no username parsed from '$str'\n";
于 2012-12-17T03:21:12.837 に答える
1

正規表現を次のようにする必要があります。\UserName\s\=\s(\w+)$この後、括弧内の部分は変数で使用可能になります$1。私の perl は少しさびているので、正しく動作しない場合は、http://www.troubleshooters.com/codecorn/littperl/perlreg.htm#StringSelections を参照してください。

于 2012-12-17T02:35:11.717 に答える