【问题标题】:Open Text File and count how many times each IP is listed打开文本文件并计算每个 IP 被列出的次数
【发布时间】:2018-06-08 15:50:29
【问题描述】:

我有一个包含很多 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

【问题讨论】:

  • 你应该放一个包含IP地址的文件样本,这样人们就可以看到它是如何格式化的。
  • Dale- 好点.. 不知道如何附加文件
  • 这需要时间。您可以为此给予奖励,或者至少尝试写一些东西。人们会帮助修复你的代码:)
  • Dale- 是的,我尝试了一些不同的方法。我已经更新了我的帖子以包含我的最佳尝试。

标签: powershell-4.0


【解决方案1】:

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

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”作为列标题。

【讨论】:

  • Ansgar 哇!非常有效率!感谢您清理我凌乱的代码。再次感谢,凯文
  • 如果计数大于 10,如何只将名称写入 C.txt?
  • 添加过滤器Where-Object { $_.Count -gt 10 }
  • 知道了!再次感谢您的帮助
猜你喜欢
  • 2014-03-12
  • 2023-01-02
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-08-25
相关资源
最近更新 更多