从列表

时间:2016-01-15 19:07:36

标签: bash ip ip-address

我的目标是获取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

1 个答案:

答案 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