我必须在Windows日志中提取包含IP地址列表的日志文件以及其他内容。我已经找到了如何将其过滤为仅IP地址的方法,但是我正在努力将其转换为IP地址对象,以便可以过滤出IPv6条目。
在生产中,我将使用类似的方法来获取日志:
$log = Get-Eventlog -Logname ABC -Source WIN-ABC -Newest 1 -ErrorAction stop
。txt或日志文件如下所示:
Compare-DomainControllers
Customer.local
192.168.1.100
192.168.1.101
192.168.1.102
2580:83:0:f2e:b25a:625f:c254:eb29
10.10.10.20
etc...
我现在正在测试的是:
$IPFullList = Get-content -path .\test.txt (Fake Log File)
$IPOnly = $IPFullList | Select-String -match "[0-9]"
[这仅返回IPv4和IPv6项目的列表,但是我希望采用该列表并将条目转换为[IPAddress]对象,以便可以过滤出IPv6项目。
我已经尝试过:
ConvertFrom-String -Inputobject $IPOnly
和:
Foreach ($IP in IPOnly){
[IPaddress] | Where-Object {$_.Type -ne "AAAA"} | Write-Host
}
他们似乎都不是骗人的。任何想法或建议将不胜感激!
您可以执行以下操作:
$IPFullList = Get-content -Path .\test.txt
$IPOnly = [IPAddress[]]($IPFullList -match '(?:\d{1,3}\.){3}\d{1,3}').Trim()
结果将是$IPOnly
中存储的IPv4地址数组。
-match
使用正则表达式匹配,如果输入(左侧)是数组,则将返回匹配的字符串。如果仅传递单个字符串,则-match
将仅返回$true
或$false
。
Trim()
方法用于删除每个字符串开头和结尾的空格。
如果要分别处理每个IP,则可以通过管道传输到Foreach-Object
:
$IPFullList = Get-content -Path .\test.txt
$IPOnly = ($IPFullList -match '(?:\d{1,3}\.){3}\d{1,3}').Trim() | Foreach-Object {
[IPAddress]$_ # Returns the IPAddress object
}