如果没有多个 if 语句,我很难做到这一点。
伪代码:
ips = [...a list of around 1000 IPs]
cidr_list = ['192.168.10.0/24', '10.10.10.0/24', '192.168.3.0/24']
for ip in ips:
if ip in cidr_list: print ip
任何人都知道使用 netaddr 中的 IPAddress 和 IPNetwork 的正确方法吗?
不能说我以前用过netaddr
,但这有效吗?
cidrs = map(IPNetwork,cidr_list)
ret = [i for i in ips if IPAddress(i) in cidrs]
您可以为此使用 Googleipaddr
软件包
pip install ipaddr
从命令行
我希望这对您有所帮助,即使它是在 bash 而不是 python 中。
#!/bin/bash
ip_address_list="192.168.10.1 192.168.3.2 10.10.10.111 192.168.100.1"
cider_list="192.168.10.0/24 10.10.10.0/24 192.168.3.0/26"
bin_ip=$(IFS="." ; for i in $ip; do echo "obase=2 ; $i"| bc; done| awk '{printf "%08d", $1}'| cut -c2-)
for cider in $cider_list ; do
network_prefix=$(echo $cider |cut -d"/" -f2)
network_addr=$(echo $cider |cut -d"/" -f1)
bin_ip=$(IFS="." ; for i in $ip; do echo "obase=2 ; $i"| bc; done| awk '{printf "%08d", $1}'| cut -c2-)
if [ $(cut -b 1-$network_prefix <<< $bin_ip) = $(cut -b 1-$network_prefix <<< $bin_network_addr) ]; then
echo "The IP address $ip is in $network_addr with a network prefix of $network_prefix"
fi
done
done
您可以使用 netaddr 模块中的 all_matching_cidrs 方法。简单而准确。
ips = [ip for ip in ips if len(netaddr.all_matching_cidrs(ip, subnet_masks))> 0]