【问题标题】:How would I convert multiple strings to an IP address in Powershell so I can filter out IPv6如何在 Powershell 中将多个字符串转换为 IP 地址,以便过滤掉 IPv6
【发布时间】:2020-09-15 22:46:29
【问题描述】:

我必须提取一个日志文件,其中包含 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 }

他们似乎都没有成功。任何想法或建议将不胜感激!

【问题讨论】:

  • 检查 .net 或 powershell 正则表达式(我个人更喜欢 .net 正则表达式)。 IPv4 地址将与 IPv6 地址根本不同,它应该很容易通过这两个记录之间的正则表达式匹配来区分。 [0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3}[.][0-9]{1,3} 应该成为 ipv4 匹配,将所有其他作为 ipv6 地址作为开始
  • 谢谢,这也很有帮助。正则表达式是要走的路。

标签: windows powershell ipv6 ipv4


【解决方案1】:

您可以执行以下操作:

$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
}

【讨论】:

    猜你喜欢
    • 2021-10-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-25
    • 2018-05-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-22
    相关资源
    最近更新 更多