需要正则表达式协助(Powershell)

时间:2017-04-28 14:59:21

标签: regex powershell

我的文本输出类似于:

svwxchmig101.vmx:111:sched.mem.min = "0"
svwxchmig101.vmx:112:sched.mem.minSize = "0"
TEAMWIKI.vmx:114:sched.mem.min = "0"
TEAMWIKI.vmx:115:sched.mem.minSize = "0"
XenTemplateWin2008.vmx:93:sched.mem.min = "0"
XenTemplateWin2008.vmx:94:sched.mem.minSize = "0"
Zenith_TalismaWIN2K12R2STD_10-13-15.vmx:103:sched.mem.min = "0"
Zenith_TalismaWIN2K12R2STD_10-13-15.vmx:104:sched.mem.minSize = "0"`

我需要在powershell中使用正则表达式,它会在每行上迭代时捕获三个组:

第一组捕获第一个冒号(不包括冒号)的所有内容。

第二组捕获'sched.mem.min'或'sched.mem.minSize'。

第三组捕获引号之间的数字值。虽然上面的示例代码将所有这些代码都显示为零,但它也可以是非零值(4096,32768等)。

在这里看了几个小时后,我根本无法弄清楚如何制作一个能完成所有三次捕获的正则表达式。

5 个答案:

答案 0 :(得分:0)

试试这个正则表达式:

^(.*?):.*?(sched.mem.min|sched.mem.minSize).*"(\d+)"$

在这里演示:

Regex101

答案 1 :(得分:0)

在提供有关提供完整信息的上述评论之后,我会注意到您不需要正则表达式来解决问题。假设该文件名为“Data.txt”......

$Data = Get-Content Data.txt
ForEach ($Line in $Data) {
    $Groups = $Line -split ":"
    $Group1 = $Groups[0]
    $Group2and3 = $Groups[-1]
    $Grps = $Group2and3 -split "="
    $Group2 = $Grps[0].Trim()
    $Group3 = $Grps[1].Trim()
# Do something with $Group1 and $Group2 and $Group3 here
}

答案 2 :(得分:0)

我会使用此正则表达式 ([^:]+).*?(sched\.mem.min(?:Size)?).*?

enter image description here脚本:

Get-Content "yourLog.txt" | ForEach-Object { 
    $result = [regex]::Match($_, '([^:]+).*?(sched\.mem.min(?:Size)?).*?"([^"]+)"')
    #$result.Groups[1].Value
    #$result.Groups[2].Value
    #$result.Groups[3].Value
}

答案 3 :(得分:0)

我喜欢正则表达式和所有内容,但“我选择了一种我无法使用的工具”并不是一个好问题。您不需要正则表达式来分割PowerShell中的字符串:

$test = @'
svwxchmig101.vmx:111:sched.mem.min = "0"
svwxchmig101.vmx:112:sched.mem.minSize = "0"
TEAMWIKI.vmx:114:sched.mem.min = "0"
TEAMWIKI.vmx:115:sched.mem.minSize = "0"
XenTemplateWin2008.vmx:93:sched.mem.min = "0"
XenTemplateWin2008.vmx:94:sched.mem.minSize = "0"
Zenith_TalismaWIN2K12R2STD_10-13-15.vmx:103:sched.mem.min = "0"
Zenith_TalismaWIN2K12R2STD_10-13-15.vmx:104:sched.mem.minSize = "0"
'@ -split "`r?`n"   # setup, you would use Get-Content


$test | ForEach-Object {

    $Name, $Mem, [int]$Num = $_.split(':= "')[0,2,6]

    $Name, $Mem, $Num
}

示例输出:

XenTemplateWin2008.vmx
sched.mem.minSize
0
Zenith_TalismaWIN2K12R2STD_10-13-15.vmx
sched.mem.min
0

答案 4 :(得分:0)

我在思考这个问题。这是一个适用于我想做的正则表达式:

(\S*\.vmx)|(sched.\w*.\w*.\w)|"(.+)