[英]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.