如何将此awk命令转换为PowerShell本地命令?

z18hc3ub  于 2023-03-02  发布在  Shell
关注(0)|答案(1)|浏览(200)

原始代码如下:

curl -sL https://ftp.apnic.net/stats/apnic/delegated-apnic-latest | \
grep "apnic|JP|ipv4" | \
awk -F '|' '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }' | \
tee JP_IPv4.txt

我想把它转换成PowerShell,这是我走了多远:

Invoke-WebRequest -Uri "https://ftp.apnic.net/stats/apnic/delegated-apnic-latest" |     
Select-String -Pattern "afrinic\|ZA\|ipv6" -ca | Select-Object -exp line |

我需要弄清楚如何将使用awk命令的最后一部分转换为PowerShell。
我使用PowerShell 7.3

nbysray5

nbysray51#

awk脚本显示为根据网络大小计算子网前缀长度。
您可以在PowerShell中将awk log(...)函数调用替换为[Math]::Log(...),以执行完全相同的计算:

# this takes care of the `curl` part
Invoke-WebRequest -Uri "https://ftp.apnic.net/stats/apnic/delegated-apnic-latest" -OutFile delegated_networks.txt

# this takes care of the `grep` part
Get-Content delegated_networks.txt |Where-Object {$_ -like 'apnic|JP|ipv4|*'} 

# this emulates the `awk | tee` part
$data|ForEach-Object {
  # -F '|'
  $cells = $_.Split('|')
  # '{ printf("%s/%d\n", $4, 32-log($5)/log(2)) }'
  '{0}/{1}' -f $cells[3],(32 - [Math]::Log($cells[4])/[Math]::Log(2))
} |Tee-Object -FilePath JP_ipv4.txt

正如@mklement0善意地指出的,您还可以在PowerShell中将日志转换操作合并到单个调用中:

PS ~>[Math]::Log(4096)/[Math]::Log(2)
12
PS ~>[Math]::Log(4096, 2)
12

相关问题