1

Tomcat サーバーで要求を行うすべてのユーザー名に一致する正規表現を作成しようとしています。ログからの行のサンプル:

192.10.123.45 - ドメイン/ユーザー名 [2012 年 7 月 30 日: 07:29:13 -0400] "GET /APP/ HTTP/1.1" 200 53167

問題は、 username にいくつかの異なる形式があることです:

  1. ユーザー名
  2. ドメイン\ユーザー名
  3. ドメイン/ユーザー名

現在の試み:

if(($line -match “GET”) -AND ($line -match "(\s-\s\w{1,})")) {
            $temp = $matches[0]
            if(($line -match “GET”) -AND ($line -match "(\s-\s\w{1,}\S)?=[\\\/](w{1,}\b)")) {
                $temp1 = $matches[0]
                Write-host $temp
            }

ユーザー名の前にスペース-スペースを開始点として使用していますが、うまく機能しているようです。現時点で関心のある唯一の PHP 呼び出しであるため、行に「GET」が含まれているかどうかを常に確認します。最初の単語は常に 1 つの単語に一致するため、2 つの一致があります。2 番目の単語が一致する場合は、ドメインを気にしないため、$temp を使用して $temp1 をトリミングします。私が本当に困っているのは、正規表現で「バックスラッシュまたはフォワードスラッシュ」を言う方法です。

また、私の正規表現が、ユーザー名に数字が含まれる場合やドメインにダッシュが含まれる場合を処理するかどうかもわかりません。これは \w によって検出されると想定していますが、テスト中の開発ではこれらのケースを見つけることができません。

正規表現の知識が不足していることを事前にお詫び申し上げます。

4

1 に答える 1

1

あなたの質問が理解できれば、文字列からドメイン\ユーザー名を抽出できるようにしたいと考えています。次の行は、例で示したものからユーザー名を引き出します。

$line = $line.split("-")[1]
$line = $line.split("[")[0]
$line = $line.trim()

これ$lineにより、次の値が残りますdomain/username

さて、ユーザー名を引き出すために。

if ($line.Contains("/")) {
    $Line = $Line.split("/")[1]
} #End if($line.Contains("/")) {
if ($line.contains("\")) {
    $Line = $line.split("\")[1]
} #End if ($line.contains("\")) {

最終結果には$lineユーザー名が含まれますこれはすべてGETの検索でラップできます

if (($line -match “GET”) {
    $Line = $Line.Replace(" - "," < ") 
    #If there is a - in the username, this replaces it so the split doesn't break up the username.  Change the < to suit whatever works best
    $line = $line.split("<")[1]
    $line = $line.split("[")[0]
    $line = $line.trim()
    if ($line.Contains("/")) {
        $Line = $Line.split("/")[1]
    } #End if($line.Contains("/")) {
    if ($line.contains("\")) {
        $Line = $line.split("\")[1]
    } #End if ($line.contains("\")) {
}#End if (($line -match “GET”) {

あなたがそこに置いた行でテストしたところ、$lineequalingになりusernameました。

これに答えた後、他の用途に正規表現が必要だったのではないかと思いました。だから私は正規表現でもこれを行う方法を書きました:

if([regex]::Match($Line,".*GET.*").Success) {
        $line = [regex]::Split($Line,".*\s[-]{1}\s")
        $Line = [regex]::Split($Line,"\s[\[].*")
    if ([regex]::Match($Line,"[\\]{1}|[//]{1}").Success) {
    $Line = [regex]::Split($Line,".*[//]|.*[\\]")
    } #End if ([regex]::Match($Line,"[\]{1}|[//]{1}").Success) {
} #End if([regex]::Match($Line,".*GET.*").Success) {

繰り返しますが、これをテストしたところ、私の環境でユーザー名を引き出すことができました。-ドメインまたはユーザー名にまたは数字がある場合、これらは気にしません。

于 2012-08-09T22:43:49.483 に答える