使用PowerShell在IP地址列表中选择所有唯一的第三个八位字节

时间:2019-02-14 04:28:44

标签: powershell

我有一个IP地址列表。它们都以10.10开始。我想要第三个八位位组的所有唯一值。这样,我就可以计算出该唯一值中有多少个。

10.10.26.251
10.10.27.221
10.10.26.55
10.10.31.12
10.10.12.31
10.10.31.11
10.10.27.15
10.10.26.5

完成后,我想知道我有3个.26网络设备,2个27等,依此类推。除了通过拆分分解八位字节并循环遍历每个八位字节之外,我想不出任何单个内衬。有什么建议么?

3 个答案:

答案 0 :(得分:1)

这是一个小的变体。 [<咧>咧嘴]我在注意到其他答案之前已经有了这个-有点不同。

它做什么...

  • 创建一个IPv4地址对象的集合以供使用
  • 通过计算的属性[第三个八位字节]对它们进行分组
  • 为每个结果组创建一个[PSCustomObject]
  • 将其发送到$Octet3_Report变量
  • 在屏幕上显示
此时,将

输出到CSV文件将很容易。这是代码...

$IP_List = @(
    [ipaddress]'10.10.26.251'
    [ipaddress]'10.10.27.221'
    [ipaddress]'10.10.26.55'
    [ipaddress]'10.10.31.12'
    [ipaddress]'10.10.12.31'
    [ipaddress]'10.10.31.11'
    [ipaddress]'10.10.27.15'
    [ipaddress]'10.10.26.5'
    )

$Octet3_Report = $IP_List |
    Group-Object -Property {$_.ToString().Split('.')[2]} |
    ForEach-Object {
        [PSCustomObject]@{
            Octet_3 = $_.Name
            Count = $_.Count
            }
        }

$Octet3_Report

屏幕输出...

Octet_3 Count
------- -----
26          3
27          2
31          2
12          1

答案 1 :(得分:0)

就像我在事后弄清楚了。 返回包含dns记录。 IP地址存储在recorddata中。我拉下IP地址的末尾。然后仅获取范围进行循环,并使用foreach循环进行计数以使其更干净。

$DNSRecordCounts = @()
$Ranges = ($Return | where-object {$_.recorddata -like "10.10.*"}).recorddata -replace "\.\d{1,3}$" | select -Unique
foreach ($range in $Ranges) {
     $DNSRecordCounts += [pscustomobject][ordered]@{
          IPRange = $range
          Count = ($Return | Where-Object {$_.recorddata -like "$($range).*"}).Count
     }
}

答案 2 :(得分:0)

根据您的问题以及我从自己的回答中可以得出的结论,如果您正在寻找更像“惯用” PowerShell的内容,则需要以下内容:

$Return `
| Select-Object -ExpandProperty recorddata `
| ForEach-Object {
    $_ -match "\d+\.\d+\.(?<octet>\d+)\.\d+" | Out-Null
    $Matches.octet
} `
| Group-Object `
| ForEach-Object {
    [PSCustomObject]@{
        Octet = $_.Name
        Count = $_.Count
    }
}