打开文本文件并计算每个 IP 被列出的次数

Open Text File and count how many times each IP is listed

我有一个包含大量 IP 地址的文本文件,每个不同的 IP 可能在文本文件中多次出现,所以我正在尝试编写(或寻求帮助编写)一个 Powershell 脚本,它可以下列: 1 - 打开文本文件,计算每个 IP 出现的次数,然后 2 - 如果总数大于 20,则将该 IP 附加到另一个名为 Banned.txt

的文件

此脚本运行后,我会手动删除文件(该文件是由另一个程序创建的),几天后,我会再次执行此脚本。

这是我最好的尝试:

$BadIP = Get-Content -Path G:\ips.txt

foreach ($ip in $BadIP) {
    $matches = Select-String -InputObject $BadIP -Pattern $ip -AllMatches
    $a = $matches.Matches.Count
    $ip + " " + $a
}

以上代码有效,但一次又一次地显示相同的 ip。结果如下所示:

197.3.11.26   1
188.128.119.172   1
64.71.18.150   1
212.92.107.105   51
95.213.162.132   1
212.92.107.105   51
212.92.107.105   51
212.92.123.202   48
64.74.185.234   1
212.92.107.105   51
212.92.107.105   51
212.92.115.227   45
212.92.123.202   48
212.92.107.105   51
212.92.115.227   45
212.92.123.202   48

如您所见,212.92.107.105 显示了很多次。

更新:工作代码:

$BadIP = Get-Content -Path G:\ips.txt
foreach ($ip in $BadIP) {
    $matches = Select-String -InputObject $BadIP -Pattern $ip -AllMatches
    $a = $matches.Matches.Count
    if ($a -gt 10) {
        Add-Content -Path G:\NewBanned.txt -Value $ip -Force 
    }
}

$B = Get-Content -Path G:\NewBanned.txt | sort | Get-Unique
Set-Content -Path G:\C.txt -Value $B -Force
197.3.11.26
188.128.119.172
64.71.18.150
212.92.107.105
95.213.162.132
212.92.107.105
212.92.107.105
212.92.123.202
64.74.185.234
212.92.107.105
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
79.175.133.67
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
186.202.182.154
212.92.115.227
23.97.190.194
212.92.123.202
116.247.79.114
212.92.107.125
212.92.107.105
95.154.89.97
212.92.115.227
212.92.123.202
212.92.107.105
37.61.220.2
212.92.115.227
216.210.86.226
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
103.196.30.114
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
72.43.207.8
212.92.123.202
52.176.111.87
51.15.147.173
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
51.15.147.173
212.92.115.227
212.92.123.202
212.92.107.105
80.241.45.18
51.15.147.173
212.92.115.227
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
51.15.147.173
212.92.123.202
212.92.115.227
212.92.107.105
51.15.147.173
212.92.123.202
212.92.107.105
212.92.115.227
121.122.140.41
61.222.127.100
187.216.131.254
138.201.35.26
212.92.123.202
212.92.107.105
212.92.115.227
51.15.147.173
162.250.124.186
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
51.15.147.173
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
51.15.147.173
212.92.115.227
212.92.123.202
198.71.53.228
212.92.107.105
212.92.115.227
212.92.123.202
51.15.147.173
212.92.107.105
212.92.115.227
212.92.123.202
121.122.140.41
212.92.107.105
51.15.147.173
212.92.115.227
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
51.15.147.173
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
51.15.147.173
212.92.123.202
212.92.115.227
138.201.35.26
212.92.107.105
212.92.123.202
51.15.147.173
124.97.39.218
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
51.15.147.173
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.118.13.124
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
83.37.113.40
212.92.115.227
212.92.107.105
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
78.110.10.245
212.92.107.105
212.92.115.227
212.92.123.202
38.110.28.23
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
212.92.115.227
212.92.123.202
212.92.107.105
212.92.123.242
212.92.123.202
212.92.115.227
212.92.107.105
212.92.123.202
212.92.115.227
212.92.107.105
212.92.115.227
212.92.107.105
212.92.123.202
88.250.238.17
212.92.115.227
212.92.107.105
88.250.238.17
212.92.123.202
212.92.115.227
212.92.107.105
208.98.255.113
124.97.39.218
177.84.35.46
1.174.101.155

让 PowerShell 为您完成繁重的工作。 Group-Object cmdlet 将相同的输入 objects 分组并自动对它们进行计数:

Get-Content 'G:\NewBanned.txt' |
    Group-Object |
    Select-Object Name, Count

输出到这样的文本文件:

Get-Content 'G:\NewBanned.txt' |
    Group-Object |
    ForEach-Object { '{0}    {1}' -f $_.Name, $_.Count } |
    Set-Content 'G:\C.txt'

像这样输出到 CSV 文件:

Get-Content 'G:\NewBanned.txt' |
    Group-Object |
    Select-Object @{n='IPAddress';e={$_.Name}}, Count
    Export-Csv 'G:\C.csv' -NoType

后面计算的属性只是将"Name"替换为"IPAddress"作为列标题。