我有分配的IP地址范围的文件。它看起来像这样:
...
arin|US|ipv4|8.0.0.0|16777216|19921201|allocated
arin|US|ipv4|9.0.0.0|16777216|19881216|assigned
apnic|ID|ipv4|122.200.144.0|2048|20061023|allocated
apnic|TW|ipv4|122.200.152.0|2048|20080424|allocated
apnic|AU|ipv4|122.200.160.0|4096|20061020|allocated
apnic|AU|ipv4|122.200.176.0|4096|20110121|allocated
apnic|JP|ipv4|122.200.192.0|8192|20061023|allocated
...
我的问题是,是否有可能以及如何使用IP地址作为Linux中的搜索参数,通过使用grep,awk或其他工具等工具从此文件中获取特定行。
e.g。如果搜索到的IP是8.8.8.8,则结果应为:
arin|US|ipv4|8.0.0.0|16777216|19921201|allocated
编辑// FUll ipv4列表可以在http://skechboy.com/ips/ipv4_table
找到答案 0 :(得分:4)
如果第4列和第5列为network prefix and subnet mask,则为grep输入ip:
#!/usr/bin/env python
import fileinput, socket, struct, sys
# x.x.x.x string -> integer
ip2int = lambda ipstr: struct.unpack('!I', socket.inet_aton(ipstr))[0]
ip = ip2int(sys.argv.pop(1)) # get ip from command-line
for line in fileinput.input(): # read from stdin or file(s) given at command-line
try:
family, network_prefix, subnet_mask = line.split('|')[2:5]
if (family == 'ipv4' and
(ip & (2**32 - int(subnet_mask))) == ip2int(network_prefix)):
print line,
except Exception:
print >>sys.stderr, "can't parse", line,
$ python grep-ip.py 192.168.5.193 <<'.'
x|x|ipv4|192.168.5.128|64|x|x
x|x|ipv4|192.168.5.192|64|x|x
x|x|ipv4|192.168.5.0|64|x|x
x|x|ipv4|192.168.5.0|256|x|x
.
x|x|ipv4|192.168.5.192|64|x|x
x|x|ipv4|192.168.5.0|256|x|x
答案 1 :(得分:4)
这是@ugoren方法的awk实现:
sphynx@fjord% cat ipgrep.awk
BEGIN { FS = "|"; }
{
ip = ip2num(ADDR);
network_start = ip2num($4);
network_length = $5;
if (ip >= network_start && ip <= network_start + network_length) {
print;
}
}
function ip2num(ip)
{
split(ip, addr, ".");
return addr[1] * 2^24 + addr[2] * 2^16 + addr[3] * 2^8 + addr[4];
}
sphynx@fjord% awk -v ADDR=8.8.8.8 -f ipgrep.awk data
arin|US|ipv4|8.0.0.0|16777216|19921201|allocated
答案 2 :(得分:1)
awk
可以这样使用:
1.使用-F'|'
参数运行,以垂直条分隔。现在$4
是第一个地址,$5
是网络规模
2.使用split($4,addr,'.')
获取包含4个地址部分的数组a
3.做一些数学运算来得到数字地址:range_start=a[0]*16777216+a[1]*65536+a[2]*256+a[3]
4.对你要找的地址做同样的数学计算
5.现在只需检查地址是否在range_start
和range_start+$5