在Linux中搜索匹配IP地址的文件

时间:2012-02-19 14:58:22

标签: linux file search awk ip-address

我有分配的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

找到

3 个答案:

答案 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
.

Output

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_startrange_start+$5

之间的范围内