regex - Powershell:将多个查询应用于日志上的foreach
问题描述
我需要从多个日志文件中获取总数据传输值。数据值显示在total
字节行的列下方。
它也分别用a g
、、m
或分隔以显示gb t
/ k
mb/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
}
解决方案
这是一种可能性。(对不起@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"}
推荐阅读
- html - 如何隐藏网格中我不在媒体查询中使用的部分?
- reactjs - 我的 App 功能没有读取导入的组件。我收到“已定义但从不使用”警告
- c++ - 是否有传递向量的通用模式
作为跨度 ? - java - 渐变色填充 | 爪哇 | 图形类
- c - 是否可以为 x64 更改 gcc 中的调用约定?
- bash - 在 bash 中将命令作为参数传递
- c++ - [C++]为什么使用 std::stringstream 对 std::string 进行迭代会产生异常字符?
- reactjs - React-router-dom 在读取路径名属性时抛出两个错误
- react-native - 安装多个包后 React Native 依赖问题
- javascript - 如何在反应中反序列化avro文件