如何使用powershell regex从事件日志消息中获取数字?

时间:2018-02-08 14:45:23

标签: regex powershell powershell-v3.0

我使用powershell来获取以下示例的事件日志消息:

  

磁盘3已超过容量利用率阈值并已使用   19683350528字节。当超过阈值时,磁盘就有了   剩余容量为87690831360字节。

我需要获得Disknumber 3,Threshold Bytes 19683350528和Remaining Bytes 87690831360。

我知道可以使用select-string -pattern。但是不知道正则表达式来获取这些值。

Function Get-LogSensemessage
{  
   Param
   (
   $LogMessage
   )

   $DiskNumber=  $LogMessage | select-string -pattern <Regular expression>
   $Threshold = $LogMessage | select-string -pattern <Regular expression>
   $RemainingCapacity =  $LogMessage | select-string -pattern <Regular expression>

[pscustomobject]@{ 
  DiskNumber = $disknumber
  Threshold = $Threshold
  RemainingCapacity = $RemainingCapacity

}

}

有人可以帮我用正则表达式获取详细信息吗?

3 个答案:

答案 0 :(得分:3)

根据评论,您可以使用正则表达式模式\d+来匹配字符串中数字的任何内容。我们可以使用-AllMatches上的Select-String开关在一次点击中获得所有匹配。

以下是我建议您将其纳入您的功能的方法:

Function Get-LogSensemessage
{  
    Param(
       [string]$LogMessage
    )

    $LogValues = ($LogMessage | Select-String -Pattern '\d+' -AllMatches).Matches.Value

    [pscustomobject]@{ 
        DiskNumber = $LogValues[0]
        Threshold = $LogValues[1]
        RemainingCapacity = $LogValues[2]
    }
}

$LogValues成为一个字符串数组,因此我们使用从[0]开始的数组索引来获取每个匹配的值。

答案 1 :(得分:1)

您可以使用简单的[0-9]+模式

答案 2 :(得分:1)

使用-AllMatches参数,仅运行一次Select-String并从结果中指定值:

$results = $text | Select-String -Pattern "\d+" -AllMatches
$FirstNum = $results.Matches[0].value
$SecondNum = $results.Matches[1].value