首页 > 解决方案 > Powershell:将多个查询应用于日志上的foreach

问题描述

我需要从多个日志文件中获取总数据传输值。数据值显示在total字节行的列下方。

它也分别用a g、、m或分隔以显示gb t/ kmb/tb/kb。

           Total    Copied   Skipped  Mismatch    FAILED    Extras
Bytes :  54.414 g  54.414 g         0         0         0         0

目前我有这个脚本,它可以遍历所有文件并提取 和 之间的值Bytes:g但我需要能够添加更多查询并添加到`foreach 文件并将它们全部汇总为一个一致的值。

这是我目前拥有的,但只输出 kb。

$pattern = "(?<=.*Bytes :.*)\w.+?(?= g.*)"
$pattern1 = "(?<=.*Bytes :.*)\w.+?(?= m.*)"
$pattern2 = "(?<=.*Bytes :.*)\w.+?(?= k.*)"

Get-ChildItem "C:\Users\logs" -Filter "BFR*" | ForEach-Object { 
    Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
} | ForEach-Object {
    Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern1 } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
} | ForEach-Object {
Get-Content "C:\Users\logs\*.log" | where-Object {$_ -match $pattern2 } | ForEach-Object {
        [double] ($matches[0])
    } | Measure-Object -Sum | Select-Object -ExpandProperty sum
}

标签: regexpowershell

解决方案


这是一种可能性。(对不起@JamesC,这是一个 1-liner :-)):

Get-ChildItem .\LogFolder\*.log |
    ForEach-Object {$totalBytes = 0}{
        Get-Content $_ | Select-String -Pattern "^Bytes\s+:\s+(?<size>\d+\.\d+) (?<units>[tgmk]).*$" | 
            Foreach-Object {
                $size = $_.Matches.Groups[1].Value

                switch ($_.Matches.Groups[2].Value)
                {
                    t {$totalbytes += (1tb * $size)}
                    g {$totalbytes += (1gb * $size)}
                    m {$totalbytes += (1mb * $size)}
                    k {$totalbytes += (1kb * $size)}
                }
            }
    } {"Total Bytes: $totalBytes"}

推荐阅读