我的目标是获取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加到计数器变量,如果它是一个范围,它使用逻辑将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
答案 0 :(得分:1)
IP是256的数字。
#!/bin/bash
ipdiff() {
declare -i dec1 dec2 diff # set integer attribute
dec1=$1*256*256*256+$2*256*256+$3*256+$4
dec2=$5*256*256*256+$6*256*256+$7*256+$8
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