Powershell:提取逗号分隔的 IP 列表?
Powershell: extracting a comma-separated list of IPs?
我正在处理来自 Nessus 的 .csv 导出,基本上我有一列 Host IPs 和一列 Plugin IDs
我的客户想要一个输出,例如,插件 X 将在一列中,然后旁边是受影响主机 IP 的逗号分隔列表,然后旁边是受影响的主机 IP。
Pic of what I'm looking for
在使用 Powershell 导入 Nessus CSV 后,我能够开始来获得我需要的东西:
$allfiltered | select-object 'Host IP','Plugin ID' | Where-Object 'Plugin ID' -like "57041" | Format-Table -Property 'Plugin ID','Host IP'
这给了我这样的输出:
57041 10.1.1.1
57041 10.1.1.2
57041 10.1.1.3
57041 10.1.1.4
57041 10.1.1.5
57041 10.1.1.6
57041 10.1.1.7
但是如您所见,我还有很长的路要走才能将其拉入我需要的输出(见上图)。
我认为我最终需要一个 for 循环来评估所有插件值,但我需要弄清楚如何从根本上查询 "Take all IPs that match plugin X and place them into a comma separated list" 并从那里开始。
你能帮我指引正确的方向吗?
-B
只需使用 Group-Object
CmdLet 即可完成您想要的操作。
例如这样的事情会将所有插件组合在一起,然后您可以迭代这些组,将 ips 连接在一起以逗号分隔的字符串并从那里做任何您想做的事情。
$Grouped = $List | group -Property PluginID | sort PluginID
Foreach ($Group in $Grouped) {
$IpsDelimited = ($group.Group | Select -ExpandProperty IP | Sort) -join ','
Write-Host "Plugin ID: $($Group.Name) " -ForegroundColor Cyan -NoNewline
Write-Host $IpsDelimited
}
这是我用于此示例的示例列表。
# The list is for example purpose based on what you have.
$List = @(
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.1'}
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.3'}
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.4'}
new-object psobject -Property @{'PluginID'='57042 ';IP='10.1.1.6'}
new-object psobject -Property @{'PluginID'='57042 ';IP='10.1.1.7'}
new-object psobject -Property @{'PluginID'='57043 ';IP='10.1.1.8'}
new-object psobject -Property @{'PluginID'='57043 ';IP='10.1.1.9'}
new-object psobject -Property @{'PluginID'='57044 ';IP='10.1.1.10'}
)
结果输出
为了好玩
如果您要将其重新导出到 CSV 文件,您可以使用计算属性直接操作您的输出对象并使用修改后的信息导出它。
$Output = $Grouped |
Select @{'N'='PluginID';E={$_.Name}},
@{N='IPSDelimited';E={($_.Group | Select -ExpandProperty IP | Sort) -join ','}},
@{N='My other field';E={$_.Group.OtherField}}
$Output | Export-Csv -Path 'MyPath' -NoTypeInformation
我正在处理来自 Nessus 的 .csv 导出,基本上我有一列 Host IPs 和一列 Plugin IDs
我的客户想要一个输出,例如,插件 X 将在一列中,然后旁边是受影响主机 IP 的逗号分隔列表,然后旁边是受影响的主机 IP。
Pic of what I'm looking for
在使用 Powershell 导入 Nessus CSV 后,我能够开始来获得我需要的东西:
$allfiltered | select-object 'Host IP','Plugin ID' | Where-Object 'Plugin ID' -like "57041" | Format-Table -Property 'Plugin ID','Host IP'
这给了我这样的输出:
57041 10.1.1.1
57041 10.1.1.2
57041 10.1.1.3
57041 10.1.1.4
57041 10.1.1.5
57041 10.1.1.6
57041 10.1.1.7
但是如您所见,我还有很长的路要走才能将其拉入我需要的输出(见上图)。
我认为我最终需要一个 for 循环来评估所有插件值,但我需要弄清楚如何从根本上查询 "Take all IPs that match plugin X and place them into a comma separated list" 并从那里开始。
你能帮我指引正确的方向吗?
-B
只需使用 Group-Object
CmdLet 即可完成您想要的操作。
例如这样的事情会将所有插件组合在一起,然后您可以迭代这些组,将 ips 连接在一起以逗号分隔的字符串并从那里做任何您想做的事情。
$Grouped = $List | group -Property PluginID | sort PluginID
Foreach ($Group in $Grouped) {
$IpsDelimited = ($group.Group | Select -ExpandProperty IP | Sort) -join ','
Write-Host "Plugin ID: $($Group.Name) " -ForegroundColor Cyan -NoNewline
Write-Host $IpsDelimited
}
这是我用于此示例的示例列表。
# The list is for example purpose based on what you have.
$List = @(
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.1'}
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.3'}
new-object psobject -Property @{'PluginID'='57041 ';IP='10.1.1.4'}
new-object psobject -Property @{'PluginID'='57042 ';IP='10.1.1.6'}
new-object psobject -Property @{'PluginID'='57042 ';IP='10.1.1.7'}
new-object psobject -Property @{'PluginID'='57043 ';IP='10.1.1.8'}
new-object psobject -Property @{'PluginID'='57043 ';IP='10.1.1.9'}
new-object psobject -Property @{'PluginID'='57044 ';IP='10.1.1.10'}
)
结果输出
为了好玩
如果您要将其重新导出到 CSV 文件,您可以使用计算属性直接操作您的输出对象并使用修改后的信息导出它。
$Output = $Grouped |
Select @{'N'='PluginID';E={$_.Name}},
@{N='IPSDelimited';E={($_.Group | Select -ExpandProperty IP | Sort) -join ','}},
@{N='My other field';E={$_.Group.OtherField}}
$Output | Export-Csv -Path 'MyPath' -NoTypeInformation