2015-02-08 28 views
0

我正在尝试为Google的计算机创建CIDR列表。当我在Linux whois -h whois.radb.net -- '-i origin AS15169' | grep ^route: | sed 's/.* //'中发布时。该清单过长且冗余。例如,在最后,我看到:简化bash中的CIDR列表

216.239.58.0/23 
216.239.58.0/24 
216.239.59.0/24 
216.239.60.0/23 
216.239.60.0/24 
216.239.61.0/24 
216.239.62.0/23 
216.239.62.0/24 
216.239.63.0/24 

这是几个屏幕上面,216.239.32.0/19上市子网的一部分。

在Bash中有减少行数的简单方法吗? 搜索所以,我发现了一些Python单行程,但是我想在Bash上运行它,如果可能的话。

+1

等都不是免费的编码服务,我们将帮助您解决您编写的代码,无法获得工作。请显示你的尝试。如果你发现Python代码,你应该能够将逻辑转换成bash。 – Barmar 2015-02-08 07:04:10

+0

Bash本身对算术的支持相当有限,而且Python很容易作为Bash内部的工具提供,大多数地方你会发现Bash这些天。也许如果你能详细说明为什么Python是不可接受的,它也可以帮助我们指导其他脚本语言(Awk,Perl等)是否可以为你工作。此外,你是否寻找现有的工具来解决这个问题,而不是编程自己的? – tripleee 2015-02-08 07:23:44

+0

我想在嵌入式ARM系统上运行脚本。我可以安装Python,但如果没有它就可以离开,我更喜欢它。我宁愿编译和安装一个或多个小程序,比如ipcalc,而不是Python。其他脚本已经需要Bash。所以问题是:这可以用比Python更轻的东西来完成吗? – 2015-02-08 08:29:34

回答

1

我能够在ipcalc的帮助下解决它。没有ipcalc,它变得更乏味。用while代替for应该加快速度。我不授予自己的点,因为我的答案是一项正在进行的工作:

lowestipinrange() 
{ 
    ipcalc "$1" | grep HostMin | sed 's/HostMin: *//'| sed 's/ .*//' 
} 

highestipinrange() 
{ 
    ipcalc "$1" | grep HostMax | sed 's/HostMax: *//'| sed 's/ .*//' 
} 

ip2dec() { 
# This is verbatim from https://stackoverflow.com/questions/10768160/ip-address-converter 
    local a b c d [email protected] 
    IFS=. read -r a b c d <<< "$ip" 
    printf '%d\n' "$((a * 256 ** 3 + b * 256 ** 2 + c * 256 + d))" 
} 

as2ip() 
{ 
    ALLSUBNETS=$(whois -h whois.radb.net -- '-i origin '$1 | grep ^route: | sed 's/.* //' | sort -k 2 -t '/') 
    USEFULSUBNETS=() 
    MINIPARRAY=() 
    MAXIPARRAY=() 
    COUNTUSEFULNETS=0 
    for subnet in $ALLSUBNETS ; do 
    CURRMINIP=`lowestipinrange $subnet` 
    CURRMINIP=`ip2dec $CURRMINIP` 
    CURRMAXIP=`highestipinrange $subnet` 
    CURRMAXIP=`ip2dec $CURRMAXIP` 
    SUBNETSEEMSUSEFUL=true 
    for ((i = 0; i < $COUNTUSEFULNETS ; i++)); do 
     if ((${MINIPARRAY[$i]} <= $CURRMINIP)) && ((${MAXIPARRAY[$i]} >= $CURRMAXIP)) ; then 
     SUBNETSEEMSUSEFUL=false 
     fi 
    done 
    if [ "$SUBNETSEEMSUSEFUL" = true ]; then 
     let "COUNTUSEFULNETS += 1" 
     MINIPARRAY+=($CURRMINIP) 
     MAXIPARRAY+=($CURRMAXIP) 
     USEFULSUBNETS+=("$subnet") 
    fi 
    done 

    for ((i = 0; i < $COUNTUSEFULNETS ; i++)); do 
    echo ${USEFULSUBNETS[$i]} 
    done 
} 
0
shopt -s extglob 
IFS=\|$IFS 
while IFS=./ read a b c d e 
do ip=$(printf %08i `bc <<<"obase=2;$a;$b;$c;$d"`) 
    network=${ip::$e}\* 
    [[ "$network" == !($netlist) ]] && 
     nets[${#nets[*]}]="$network" netlist="${nets[*]}" && echo $a.$b.$c.$d/$e 
done 

该脚本输出的网络地址不是先前看到的网络的一部分。它通过将输入CIDR表示法转换为仅包含网络前缀的二进制数字(0和1)的字符串$network,并使用扩展pattern matching在(超)网络的累积列表$netlist中搜索网络,输出网络并将其添加到列表中,如果不符合超网模式。

+0

我无法使它工作。我把它粘贴在一个新的文本文件上,set + x,尝试用管道输出CIDR列表。它不会工作。 – 2016-02-11 03:29:12

+0

_它不会工作_不是一个有用的描述。结果是什么?你有没有提出一个不同于你的问题中列出的清单?如果是这样,你应该提供该清单,以使问题可重现。 – Armali 2016-02-16 09:29:53