BEGIN { dev_p=-2; } function prefix(b) { return 0xFFFFFFFF-(2**(32-b)-1); } function cidr(a,l,l1,p) { if(split(a,p,".") != 4) { return 0; } l=or(lshift(p[1],24),lshift(p[2],16)); l1=or(lshift(p[3],8),p[4]); return or(l,l1); } function addr_m(a,i,p) { if(split(a,p,"/") != 2) { return -1;} if((and(cidr(i),prefix(p[2]))) == cidr(p[1])) { return p[2];} else {return -1;} } { if($0 ~/^#/) { next; } if($3 ~/default/) { if(dev_p == -2) { dev_p=-1; d_grp=$1; d_dev=$3; d_gw=$4; d_net="default"; next; } } l_p=addr_m($3,ip); if(dev_p<l_p) { grp=$1; dev=$2; dev_p=l_p; net=$3; gw=$4; } } END { if(dev_p == -1) { grp=d_grp; dev=d_dev; gw=d_gw; net=d_net; } print "GROUP="grp; print "IF="dev; print "NET="net; print "GW="gw } subnets.awkфайлик сетями в таком формате #group-name interface network gataway group1 eth0 default 172.20.3.1 .... поиск примернно так awk -v ip=$1 -fsubnets.awk ${SUBNET_FILE} на perl еще проще
|