PowerShell提取txt中CPU编号与%idle值输出指定格式JSON
问题背景
现有保存在txt文件中的mpstat输出内容如下:
Average: CPU %usr %nice %sys %iowait %irq %soft %steal %guest %gnice %idle Average: all 0.21 0.00 0.08 0.00 0.00 0.00 0.00 0.00 0.00 99.71 Average: 0 1.01 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 98.99 Average: 1 0.00 0.00 0.52 0.00 0.00 0.00 0.00 0.00 0.00 99.48
需求为提取每行第二列的CPU编号、最后一列的%idle值,输出为包含Num、Data两个字段的对象数组格式JSON,预期结果如下:
[ {"Num":"all","Data":"99.71"}, {"Num":"0","Data":"98.99"}, {"Num":"1","Data":"99.48"} ]
现有PowerShell代码输出的是字符串数组格式的JSON,不符合需求,原代码如下:
$file = Join-Path $PSScriptRoot cpu.txt # 创建统计临时文件 $cpu_stats = mpstat -P ALL 1 2 | grep Average > $file # 提取CPU编号列和%idle列 $info_json = Get-Content $file | Select-object -skip 1| Foreach {"Num_$(($_ -split '\s+',12)[1,11])"} | ConvertTo-Json # 输出JSON结果 Write-Output $info_json
修改方案
原代码问题在于ForEach循环中输出的是拼接字符串,而非结构化对象,因此序列化后得到的是字符串数组。只需要将循环内的逻辑改为返回带对应属性的自定义对象即可,修改后完整代码如下:
$file = Join-Path $PSScriptRoot cpu.txt # 创建统计临时文件 mpstat -P ALL 1 2 | grep Average > $file # 提取字段生成自定义对象数组 $info_array = Get-Content $file | Select-Object -Skip 1 | ForEach-Object { $columns = $_ -split '\s+', 12 [PSCustomObject]@{ Num = $columns[1] Data = $columns[11] } } # 转换为符合要求的JSON $info_json = $info_array | ConvertTo-Json # 输出结果 Write-Output $info_json
内容的提问来源于stack exchange,提问作者Eddy
相关产品推荐
相关产品推荐

