解析命令水平输出

时间:2016-03-26 07:14:56

标签: parsing powershell logging

我有一个脚本可以解析最后15行的日志文件,但它会以水平线输出数据,当我尝试获取文件中数字的平均值时,我认为这会干扰。

以下是我正在解析的日志文件示例:

3/22/2016 9:11:21 AM 44.0
3/22/2016 9:11:22 AM 44.1
3/22/2016 9:11:23 AM 44.2
3/22/2016 9:11:24 AM 44.3

这是我的PowerShell命令,用于解析活动日志文件的最后15行。

$regexNUM = '\d+\.\d+'

$NUMLog = Get-ChildItem -Path 'C:\Users\Admin\Documents' |
          Where-Object {$_.Name -match "LOGFILE"} |
          Sort LastWriteTime | Select -Last 1

$NUMBERS = Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
           Select-String -Pattern $regexNum -AllMatches |
           % { $_.Matches } | % { $_.Groups }

当我执行Write-Host $NUMBERS时,它会输出如下数据:

39.5 39.6 39.7 39.8 39.9 40.0 40.1 40.2 40.3 40.4 40.5 40.6 40.7 40.8 40.9

以下是我试图获得这15个数字的平均值的方法:

$Average = $NUMBERS | Measure-Object -Average | Select Average

当我Write-Host $Average时,它说:

Measure-Object : Input object "39.5" is not numeric.
At C:\Users\Admin\Documents\SampleTest.ps1:26 char:30
+ $Average = $NUMBERS | Measure-Object -Average | Select Average
+                       ~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo          : InvalidType: (39.5:Match) [Measure-Object], PSInvalidOperationException
    + FullyQualifiedErrorId : NonNumericInputObject,Microsoft.PowerShell.Commands.MeasureObjectCommand

我不确定为什么会说数字39.5不是数字,但我可以假设它不喜欢它与空格可能是水平的。它也会为15个数字中的每一个抛出其中一个错误。

1 个答案:

答案 0 :(得分:2)

问题:

代码中的问题是您实际上将System.Text.RegularExpressions.Match类型的对象提供给Measure-Object cmdlet,而不是数字。

Write-Host命令会在需要将Match对象输出到控制台时自动将其转换为文本,这会让您认为它看起来像数字。

解决方案:

要解决此问题,请更改以下行以获取Match个对象中的值:

$NUMBERS = Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
           Select-String -Pattern $regexNum -AllMatches |
           % { $_.Matches } | % { $_.Value }

建议:

要自行修复此类问题,可以使用Get-Member cmdlet检查返回的类型。

在您的情况下,您可以将第二个Get-Content cmdlet的输出发送到Get-Member,而不是将其保存到变量:

Get-Content -Path "C:\Users\Admin\Documents\$NumLog" -Tail 15 |
    Select-String -Pattern $regexNum -AllMatches |
    % { $_.Matches } | % { $_.Groups } | Get-Member