从列表中计算 IP 地址
Count IP addresses from list
我的目标是获取一个 IP 列表,有时该列表只是一个 IP,也可能是一个 IP 范围,然后计算一个列表中有多少个 IP。我们有另一种产品可以生成 IP 列表,我们一直在使用 Excel 电子表格手动计算它。
使用 Stack 上现有的 post,我一直在尝试将其合并到一个将接受列表的脚本中。 https://codegolf.stackexchange.com/questions/28760/how-many-ip-addresses-are-in-a-given-range(参见 Pure Bash,66 字节)。
我没有在命令行中获取两个参数 $1 和 $2,而是将列表拉入数组然后枚举数组。如果它是单个 IP,它只是将 1 添加到计数器变量,如果它是一个范围,它使用逻辑将 IP 转换为十六进制并计算它们。我 运行 遇到了一个我收到错误的问题。
我似乎无法理解为什么会显示 "invalid number: printf: 229"。我已经阅读了扩展原理,但我似乎无法理解为什么它会不断抛出此错误并错误地计算它。
我使用这个网站很多年了,这是我的第一个 post。任何帮助将不胜感激!
谢谢!
这是我目前拥有的:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please supply a list of IP addresses"
echo "Example: " [=10=] "list.txt"
exit
fi
#Set some variables
LIST=($(cat ./))
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 是以 256 为基数的数字。
#!/bin/bash
ipdiff() {
declare -i dec1 dec2 diff # set integer attribute
dec1=*256*256*256+*256*256+*256+
dec2=*256*256*256+*256*256+*256+
diff=$dec2-$dec1+1
counter=counter+$diff
}
declare -i counter
# read IP(s) from file, use . and - as separator
while IFS=".-" read -r a1 a2 a3 a4 b1 b2 b3 b4; do
if [[ -z $b1 ]]; then # $b1 is empty (line with one IP)
counter=counter+1
else # $b1 is not empty (line with 2 IPs)
ipdiff $a1 $a2 $a3 $a4 $b1 $b2 $b3 $b4
fi
done < file
echo $counter
输出:
18
我的目标是获取一个 IP 列表,有时该列表只是一个 IP,也可能是一个 IP 范围,然后计算一个列表中有多少个 IP。我们有另一种产品可以生成 IP 列表,我们一直在使用 Excel 电子表格手动计算它。
使用 Stack 上现有的 post,我一直在尝试将其合并到一个将接受列表的脚本中。 https://codegolf.stackexchange.com/questions/28760/how-many-ip-addresses-are-in-a-given-range(参见 Pure Bash,66 字节)。
我没有在命令行中获取两个参数 $1 和 $2,而是将列表拉入数组然后枚举数组。如果它是单个 IP,它只是将 1 添加到计数器变量,如果它是一个范围,它使用逻辑将 IP 转换为十六进制并计算它们。我 运行 遇到了一个我收到错误的问题。
我似乎无法理解为什么会显示 "invalid number: printf: 229"。我已经阅读了扩展原理,但我似乎无法理解为什么它会不断抛出此错误并错误地计算它。
我使用这个网站很多年了,这是我的第一个 post。任何帮助将不胜感激!
谢谢!
这是我目前拥有的:
#!/bin/bash
if [ $# -lt 1 ]; then
echo "Please supply a list of IP addresses"
echo "Example: " [=10=] "list.txt"
exit
fi
#Set some variables
LIST=($(cat ./))
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 是以 256 为基数的数字。
#!/bin/bash
ipdiff() {
declare -i dec1 dec2 diff # set integer attribute
dec1=*256*256*256+*256*256+*256+
dec2=*256*256*256+*256*256+*256+
diff=$dec2-$dec1+1
counter=counter+$diff
}
declare -i counter
# read IP(s) from file, use . and - as separator
while IFS=".-" read -r a1 a2 a3 a4 b1 b2 b3 b4; do
if [[ -z $b1 ]]; then # $b1 is empty (line with one IP)
counter=counter+1
else # $b1 is not empty (line with 2 IPs)
ipdiff $a1 $a2 $a3 $a4 $b1 $b2 $b3 $b4
fi
done < file
echo $counter
输出:
18