2015-02-08 27 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