【发布时间】:2016-04-21 11:01:18
【问题描述】:
我的目标是获取一个 IP 列表,有时该列表只是一个 IP,或者它可能是一个 IP 范围并计算列表中有多少个 IP。我们有另一个产品可以生成 IP 列表,我们一直在使用 Excel 电子表格手动计算它。
使用 Stack 上的现有帖子,我一直在尝试将其合并到可以接受列表的脚本中。 https://codegolf.stackexchange.com/questions/28760/how-many-ip-addresses-are-in-a-given-range(参见 Pure Bash,66 字节)。
我没有在命令行 $1 和 $2 上获取两个参数,而是将一个列表拉入一个数组,然后枚举该数组。如果它是单个 IP,它只是将 1 加到 counter 变量中,如果它是一个范围,它使用逻辑将 IP 转换为十六进制并计算它们。我遇到了一个我收到错误的问题。
我似乎无法弄清楚为什么这会显示“无效号码:printf:229”。我已经阅读了扩展原理,但我似乎无法理解为什么它会不断抛出这个错误并不正确地计算它。
我已经使用这个网站很多年了,这是我的第一篇文章。任何帮助将不胜感激!
谢谢!
这是我目前所拥有的:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please supply a list of IP addresses"
echo "Example: " $0 "list.txt"
exit
fi
#Set some variables
LIST=($(cat ./$1))
COUNT=0
# Function for removing dots and converting to hex
p()(printf %02x ${1//./ })
# Enumerate the array of IPs
for RANGE in ${LIST[@]};do
IFS=- read IP1 IP2 <<< $RANGE
if [ -z $IP2 ]; then
COUNT=$[COUNT + 1]
else
r=$[0x`p $IP1`-0x`p $IP2`]
COUNT=$[COUNT + $[1+${r/-}]]
fi
done
echo "The count is" $COUNT
sample_range.txt:
192.168.47.11
192.168.48.10
192.168.65.228-192.168.65.229
192.168.65.234
192.168.65.239
192.168.65.241
192.168.65.244
192.168.80.220
192.168.93.231-192.168.93.235
192.168.93.237-192.168.93.239
192.168.103.222
这应该是 18,而是给我这个输出:
# ./rc.sh sample_range.txt
: invalid number: printf: 229
: invalid number: printf: 235
: invalid number: printf: 239
The count is 707
【问题讨论】:
-
您的 IP 范围是否总是限制在 /24 子网?
-
嘿赛勒斯,不,子网通常会有所不同。我想如果范围是 10.10.65.1-10.11.65.255。它仍应将 512 视为对该范围计数结果的答案。
-
我假设结果是 65791 (10.10.65.1-10._11_.65.255.)
-
是的,你是对的!我脑子里放了个屁,我想我为那个例子增加了第三个八位位组。
-
啊,我马上就投了赞成票,但我不知道复选框。谢谢。
标签: bash ip ip-address