我有一个大型日志文件,我正在尝试从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一直让我很头疼。任何帮助将不胜感激。
答案 0 :(得分: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
答案 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