正则表达式如何从日志文件中返回两个字符串

时间:2016-06-02 21:27:13

标签: regex powershell logfile-analysis

我有一个大型日志文件,我正在尝试从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或;

Regex一直让我很头疼。任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:0)

regex作品适用于您:

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

Regular expression visualization

Regex Demo.

要在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

答案 1 :(得分: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