如何将指定awk命令转换为PowerShell 7.3原生实现?
如何将指定awk命令转换为PowerShell 7.3原生实现?
嘿,我来帮你搞定这个转换!你已经完成了前面的核心筛选步骤,剩下的awk逻辑完全可以用PowerShell 7.3的原生命令实现,咱们一步步拆解:
首先先明确原来的awk命令干了啥:
- 按
|分割每行内容 - 提取第4个字段(IPv4地址)和第5个字段(地址数量)
- 计算子网前缀长度:
32 - log(地址数量)/log(2)(本质是求以2为底的地址数量的对数,再用32位IPv4总长度减去它) - 把地址和前缀长度拼成
IP/长度的格式输出,同时保存到文件
针对你当前写的匹配afrinic|ZA|ipv6的PowerShell代码,我给你补全后面的处理逻辑,注意IPv6是128位地址空间,所以前缀长度的计算要把32改成128:
Invoke-WebRequest -Uri "https://ftp.apnic.net/stats/apnic/delegated-apnic-latest" | Select-String -Pattern "afrinic\|ZA\|ipv6" -CaseSensitive | Select-Object -ExpandProperty Line | ForEach-Object { # 按|分割每行,因为|是正则特殊字符,所以用转义后的分隔符 $fields = $_ -split '\|' # 提取IP地址(awk的$4对应PowerShell的索引3,因为是0开始计数) $ip = $fields[3] # 提取地址数量并转成整数(awk的$5对应索引4) $addrCount = [int]$fields[4] # 计算IPv6前缀长度:128位总长度减去以2为底的地址数量对数 # PowerShell 7直接支持指定底数的Log方法,不用手动算log(a)/log(b) $prefixLen = 128 - [Math]::Log($addrCount, 2) # 格式化输出IP/前缀长度的格式 "{0}/{1}" -f $ip, [int]$prefixLen } | # 用Tee-Object实现和bash tee一样的效果:同时输出到控制台和保存到文件 Tee-Object -FilePath ZA_IPv6.txt
如果之后你要转回处理IPv4(比如原来的apnic|JP|ipv4),只需要做两个调整:
- 把
Select-String的Pattern改成apnic\|JP\|ipv4 - 把前缀长度计算里的
128改回32
另外补充个小细节:APNIC的分配数据里,地址数量都是2的整数次幂,所以[Math]::Log($addrCount,2)的结果肯定是整数,直接转成[int]就没问题;如果遇到非2次幂的情况,你可以用[Math]::Floor()来取整,不过这种情况在这类统计文件里几乎不会出现。
备注:内容来源于stack exchange,提问作者user20682592
相关产品推荐
相关产品推荐

