1

我有一个很大的日志文件,我试图从使用 powershell 正则表达式中提取两条信息到一行。日志包含各种数据,但我感兴趣的块我在下面给出了示例。我正在尝试查找使用错误版本的应用程序登录的用户。

示例数据(预览中没有显示,但有换行符):

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 的任何记录,因为这是正确的版本。

对于用户名部分,我可以使用类似(?<=Device User Name: )(.*)

我如何获得它旁边的版本号?
版本号总是以“Client-Version”(一些文本)“v”(版本号)开头,然后是 a 或 ;

正则表达式总是让我头疼。任何帮助将不胜感激。

4

2 回答 2

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 回答
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 回答