【问题标题】:Powershell - creating hashtables from large text files and searchingPowershell - 从大型文本文件创建哈希表并进行搜索
【发布时间】:2020-12-21 00:49:25
【问题描述】:

我正在使用一个哈希表,该哈希表是使用以 CSV 格式存储的 350 万个 IP 地址的列表构建的,并且我正在尝试使用通配符搜索该表。

CSV 是 MaxMind 的 IP 列表,我使用以下代码将其转换为 Hashtable

[System.IO.File]::ReadLines("C:\temp\iptest.csv") | ForEach-Object { $data= $_.split(','); $ht = @{"geoname_id"="$($data[1])";"registered_country_geoname_id"="$($data[2])"}
$name = $($data[0])
$mainIPHhash.add($name, $ht)}

代码只是提取 CIDR 和它对应的城市/国家代码。 这很好用,并且在两分钟多一点的时间内构建了表,但我现在面临的问题是在这个哈希表中搜索通配符条目。

如果我搜索完整的 CIDR,搜索会以毫秒为单位进行

$mainIPHhash.item("1.0.0.0/24")

Measure command reports - TotalSeconds : 0.0001542

但是如果我需要进行通配符搜索,它必须遍历哈希表来寻找我喜欢的值,这需要很长时间!

$testingIP = "1.0.*"
$mainIPHhash.GetEnumerator() | Where-Object { $_.key -like $testingIP }

Measure command reports - TotalSeconds : 33.3016279

有没有更好的方法在哈希表中搜索通配符条目?

干杯

编辑:

使用正则表达式搜索,我可以将其缩短到 19 秒。但是还是很慢


$findsStr = "^$(($testingIP2).split('.')[0])" +"\."+ "$(($testingIP2).split('.')[1])" +"\."

$mainIPHhash.GetEnumerator() | foreach {if($_.Key -match $findsStr){#Dostuff }}

上面取 IP 地址的前两个八位字节,并使用正则表达式在哈希表中找到它们。


Days              : 0
Hours             : 0
Minutes           : 0
Seconds           : 19
Milliseconds      : 733
Ticks             : 197339339
TotalDays         : 0.000228402012731481
TotalHours        : 0.00548164830555556
TotalMinutes      : 0.328898898333333
TotalSeconds      : 19.7339339
TotalMilliseconds : 19733.9339

【问题讨论】:

    标签: powershell hashtable


    【解决方案1】:

    您可以获取 IP 列表并使用-like-match 获取列表。两者都应该比Where-Object 子句更快

    $mainIPhash.Values -like '1.0.*'
    
    $mainIPhash.Values -match '^1\.0\.'
    

    【讨论】:

    • 你先生,是个传奇。那工作得很好。非常感谢。
    • 哪个更快?我有一个非常大的列表,其中有很多重复项。
    • 他们相当不错!第一个测量命令的输出 - TotalMilliseconds:0.1165。第二个 - TotalMilliseconds : 0.1237
    【解决方案2】:

    其他解决方案可能是,使用 group-object :

    $contentcsv=import-csv "C:\temp\iptest.csv" -Header Name, geoname_id, registered_country_geoname_id |Group Name
    $contentcsv | where Name -like '1.0.*'
    

    【讨论】:

    • 谢谢!唯一的问题是 import-csv 文件这么大会占用大量资源。
    • 啊好的,我明白了:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-07-08
    • 1970-01-01
    • 1970-01-01
    • 2011-01-10
    相关资源
    最近更新 更多