繁体   English   中英

计算文本文件中 ip 列表的出现次数

[英]Count occurrences of a list of ip in a text file

我需要计算列表 ip 的文件文本中出现的次数。

8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
8.8.8.8
1.1.1.1
1.1.1.1
1.1.1.1
1.1.1.1

我试过了:

Get-Content "C:\listip.txt" | Select-String -Pattern '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' | measure

但我收到的是总数,而不是每次出现的总和。 在 linux 上,我会简单地使用 uniq -c

正如Santiago Squarzon所建议的那样,只需将 pipe 放入Group-Object

Get-Content "c:\listip.txt" | 
    Select-String -Pattern '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$' | 
    Group-Object -NoElement | 
    Select-Object Count, @{ n='IP'; e='Name' }

Output:

Count IP
----- --
    4 1.1.1.1
    9 8.8.8.8

参数-NoElement删除Group-Object默认为 output 的Group属性,但不需要仅用于计数。

我添加了Select-Object以使用计算属性Name属性重命名为IP

如果您想正确地对唯一 IP 进行排序(即不是字符串排序,而是按数字排序),您可以查看此答案

Group-Object的替代方案可以使用hash 表

Get-Content C:\listip.txt | & {
    begin { $out = @{} }
    process { $out[$_.Trim()] += 1 }
    end { $out }
}

来自匿名 function的 Output 将是:

Name                           Value
----                           -----
1.1.1.1                        4
8.8.8.8                        9

如果您只想过滤或定位与您的模式匹配的行,您可以添加一个if条件并使用匹配运算符-match

Get-Content C:\listip.txt | & {
    begin { $out = @{} }
    process {
        # if the line matches this pattern there is for sure no need to `.Trim()`
        if($_ -match '^(?:(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$') {
            $out[$_] += 1
        }
    }
    end { $out }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM