【问题标题】:Count IP addresses from list从列表中计算 IP 地址
【发布时间】: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


【解决方案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

【讨论】:

  • 非常好。这种方法更有意义。谢谢。
  • Cyrus,它是如何从文件中读取的?我将示例文件重命名为“文件”,但出现此错误。 ")syntax error: invalid arithmetic operator (error token is " 3
  • 你使用哪个版本的 bash?
  • 鲍勃你的叔叔!很棒的工作赛勒斯!我今天刚刚学到了很多东西。 (dos2unix) 就像一个魅力。
  • 在其他新闻中,我发布的原始脚本现在也可以使用。问题一直是那些回车。这是奥卡姆剃刀时刻。
猜你喜欢
  • 1970-01-01
  • 2015-08-19
  • 1970-01-01
  • 1970-01-01
  • 2012-04-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多