(bash)检查IP是否在子网范围文件中

我有一个文件中的子网范围的列表:

2.32.0.0-2.47.255.255-255.240.0.0 2.112.0.0-2.119.255.255-255.248.0.0 2.156.0.0-2.159.255.255-255.252.0.0 2.192.0.0-2.199.255.255-255.248.0.0 ... 

(文件格式是: {startip}-{endip}-{netmask}

我需要检查一个IP是否包含在文件中的一个子网中。

尝试这个:

 BEGIN { FS="." ex = "false" split(address, ip, ".") } { split($0, range, "[-.]") for (i=1; i<5; i++) { if (ip[i] < range[i] || ip[i] > range[i+4]) break; else if ((ip[i] > range[i] && ip[i] < range[i+4]) || i == 4) ex = "true" } } END { print ex } 

像这样调用awk脚本( checkIP.awk ):

 $ awk -v address="2.156.0.5" -f checkIP.awk /path/to/ip/ranges/file true $ awk -v address="0.0.0.0" -f checkIP.awk /path/to/ip/ranges/file false 

你可以使用awk

 echo '127.0.0.0-127.255.255.255-255.0.0.0' | awk -F- ' BEGIN { ip[1] = 127; ip[2] = 0; ip[3] = 0; ip[4] = 1; } { split($1, startIp, "."); split($2, endIp, "."); for(i = 1; i <= 4; i++) { if(ip[i] < int(startIp[i]) || ip[i] > int(endIp[i])) break; } if(i == 5) print "matching line: ", $0; }' 

用于搜索的IP最初在数组BEGIN子句中被设置为数组。 每行在for-cycle中进行比较,如果在startIpendIp之间startIp每个八位字节,则打印“匹配行”。


一些Python 3依赖于3.3的ipaddress模块​​(可用于2.6 / 2.7:

 python3 -c 'from ipaddress import ip_address as IP; list( map(print, ((startip, endip) for startip, endip, _ in (ip.split("-") for ip in open("tmp/iplist.txt")) if IP(startip) < IP("127.0.0.1") < IP(endip))))' 

这其实是以下脚本的单行版本:

 import sys from ipaddress import ip_address as IP ip = IP(sys.argv[1]) with open(sys.argv[2]) as f: for line in f: startIp, endIp, _ = line.split('-') if IP(startIp) < ip < IP(endIp): print(line) 

可以这样使用:

 $ python3 ipcheck.py 127.0.0.1 iplist.txt 

你可以使用这个awk脚本:

 awk -F- -v arg='2.158.1.2' 'function ipval(arg) { split(arg, arr, "."); s=0; for (i=1; i<=length(arr); i++) s += arr[i] * (10**(6-i)); return s } ipval(arg) >= ipval($1) && ipval(arg) <= ipval($2)' file 2.156.0.0-2.159.255.255-255.252.0.0 

ipval将给定的IP地址转换为数值,以便使用算术运算符可以轻松地进行比较。