1

powershell 正規表現を使用して 2 つの情報を 1 行に抽出しようとしている大きなログ ファイルがあります。ログにはあらゆる種類のデータが含まれていますが、私が興味を持っているブロックの例を以下に示します。間違ったバージョンのアプリでログインしているユーザーを見つけようとしています。

サンプルデータ (プレビューには表示されませんが、改行があります):

Device User Name: CDALLAS
Is SSO          : false
Versions        : id=VNF-Android
0=Client-Version,VN v4.82.1;android;SM-G900V,.

Device User Name: smith5
Is SSO          : false
Versions        : id=VNF-Android
0=Client-Version,VNNEXT v4.32,.

Device User Name: joe123
Is SSO          : false
Versions        : id=VNF-iOS
0=Client-Version,APPSTORE v5.89;iPhone OS;iPhone8   1,.

これらのそれぞれについて返す必要があるのは次のとおりです。

CDALLAS 4.82.1

smith5 4.32

joe123 5.89

理想的には、4.82.1 が正しいバージョンであるため、4.82.1 を含むレコードを除外したいと思います。

ユーザー名の部分には、次のようなものを使用できます(?<=Device User Name: )(.*)

ただし、その横にあるバージョン番号を取得するにはどうすればよいですか?
バージョン番号の前には常に「Client-Version」(テキスト)、「v」(バージョン番号)、または ; のいずれかが続きます。

正規表現はいつも頭を悩ませてきました。どんな助けでも大歓迎です。

4

2 に答える 2

0

これregexはあなたのために働くはずです:

Device User Name:\s+\b(?<name>\w+).*?(?<=Client-Version).*?v(?<version>\d[^;,]+)

正規表現の視覚化

正規表現のデモ。

これを使用するには、次のオプションPowerShellを使用する必要があります。[System.Text.RegularExpressions.RegexOptions]::Singleline

$content = Get-Content 'YOUR_FILE_PATH' -raw
$regex = 'Device User Name:\s+\b(?<name>\w+).*?(?<=Client-Version).*?v(?<version>\d[^;,]+)'
[regex]::Matches($content, $regex, [System.Text.RegularExpressions.RegexOptions]::Singleline) | ForEach-Object {
    '{0} {1}' -f $_.Groups['name'].Value, $_.Groups['version'].Value
}

出力:

CDALLAS 4.82.1
smith5 4.32
joe123 5.89
于 2016-06-02T21:40:48.443 に答える
0

あなたはすでに解決策を持っているように見えますが、ここにも役立つかもしれないものがあります

$text = @'
Device User Name: CDALLAS
Is SSO          : false
Versions        : id=VNF-Android
0=Client-Version,VN v4.82.1;android;SM-G900V,.

Device User Name: smith5
Is SSO          : false
Versions        : id=VNF-Android
0=Client-Version,VNNEXT v4.32,.

Device User Name: joe123
Is SSO          : false
Versions        : id=VNF-iOS
0=Client-Version,APPSTORE v5.89;iPhone OS;iPhone8   1,.

'@.Split("`n")

$hash = @{}
$text | % {
    if ($_ -match ': ') {
        $split = $_.Split(':').Trim()
        $hash.Add($split[0], $split[1])
    } elseif ($_ -match ' v([0-9\.]+)') {
        $hash.Add('Version', $Matches[1])
        [pscustomobject]$hash
        $hash = @{}
    }
}

# yields:
# Is SSO Version Device User Name Versions      
# ------ ------- ---------------- --------      
# false  4.82.1  CDALLAS          id=VNF-Android
# false  4.32    smith5           id=VNF-Android
# false  5.89    joe123           id=VNF-iOS 
于 2016-06-02T21:59:24.173 に答える