将IP范围转换为单个IP地址BASH

时间:2017-03-22 11:13:42

标签: bash

一直在寻找和尝试不同的方式。 至于现在我的代码是这样的:

wget --no-check-certificate -qO- https://raw.githubusercontent.com/prbutler/EZProxy_IP_Blacklist/master/EZProxy_IP_Blacklist_RejectIP.txt | grep "RejectIP " | awk '{print $2}'  >> EZProxyIP_ALL.txt
cat EZProxyIP_ALL.txt | grep "-" | sed -r 's/-/ /g' >> EZProxy_Range.txt
cat EZProxyIP_ALL.txt | grep -v "-" >> EZProxyIP.txt
rm EZProxyIP_ALL.txt

现在,这会创建两个文本文件,一个包含所有单个地址,另一个包含ip' s。 我使用sed,以便文本文件EZProxy_Range.txt如下所示:

5.8.44.0 5.8.46.255

现在我试图让脚本列出所有的ip地址:

5.8.44.0
5.8.44.1
And so on...

但是我无法弄明白,怎么样?

2 个答案:

答案 0 :(得分:0)

使用Net::IP

的perl

对于此类(-分隔范围的输入行,例如,您不需要sed -r 's/-/ /g'

10.10.10.1 - 10.10.10.5
10.11.11.250 - 10.11.12.4
使用

perl -MNet::IP -nlE '$i=Net::IP->new($_);while($i){say $i++->ip()}'

产生

10.10.10.1
10.10.10.2
10.10.10.3
10.10.10.4
10.10.10.5
10.11.11.250
10.11.11.251
10.11.11.252
10.11.11.253
10.11.11.254
10.11.11.255
10.11.12.0
10.11.12.1
10.11.12.2
10.11.12.3
10.11.12.4

更具可读性

perl -MNet::IP -nlE '
    $i = Net::IP->new( $_ ); 
    while( $i ) {
        say $i++->ip()
    }'

答案 1 :(得分:0)

您可以使用嵌套循环的脚本以纯粹的bash方式为您解决此问题。

gen_ip.sh

#!/bin/bash

START=$1
END=$2

IFS='.' 
read -r -a SIP <<< "$START"
read -r -a EIP <<< "$END"

for (( a = ${SIP[0]} ; a <= ${EIP[0]} ; a++)); do
for (( b = ${SIP[1]} ; b <= ${EIP[1]} ; b++)); do
for (( c = ${SIP[2]} ; c <= ${EIP[2]} ; c++)); do
for (( d = ${SIP[3]} ; d <= ${EIP[3]} ; d++)); do
    echo "$a:$b:$c:$d"
done
done
done
done

生成

% sh gen_ip.sh 5.8.44.0 5.8.46.255
5:8:44:0
5:8:44:1
5:8:44:2
...
...
5:8:46:253
5:8:46:254
5:8:46:255