免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: wildgoose
打印 上一主题 下一主题

请教一个匹配脚本的写法 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2007-05-12 10:24 |只看该作者
awk 版

  1. awk -F'/' '
  2. function initMaskTable(){

  3.         _maskCount = 0;

  4.         while ((getline < "mask") > 0) {
  5.                
  6.                 if (split($1, arrMask, ".") != 4) continue;

  7.                 _mask1[maskCount] = arrMask[1];
  8.                 _mask2[maskCount] = arrMask[2];
  9.                 _mask3[maskCount] = arrMask[3];
  10.                 _mask4[maskCount] = arrMask[4];

  11.                 _maskCount++;
  12.         }
  13. }

  14. function checkIP(pIP, i){
  15.        
  16.         if (split(pIP, arrIP, ".") != 4) return 0;

  17.         for (i = 0; i < _maskCount; i++)
  18.                 if (checkMaskPart(_mask1[i], arrIP[1]) &&
  19.                         checkMaskPart(_mask2[i], arrIP[2]) &&
  20.                         checkMaskPart(_mask3[i], arrIP[3]) &&
  21.                         checkMaskPart(_mask4[i], arrIP[4])) return 1;

  22.         return 0;
  23. }

  24. function checkMaskPart(pMaskPart, pIPPart){

  25.         return and(pMaskPart, pIPPart) == pMaskPart;
  26. }

  27. BEGIN {
  28.         initMaskTable();
  29. }

  30. {
  31.         print $0 ": " (checkIP($0) ? "OK" : "FALSE");
  32. } urfile
复制代码

论坛徽章:
0
22 [报告]
发表于 2007-05-12 10:27 |只看该作者
像Eden那样组织一下数据,就能节省数组个数,并且更简单

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
23 [报告]
发表于 2007-05-12 10:58 |只看该作者
也来个awk的

  1. awk 'BEGIN{ FS="[./;]";printf "Input an IP: ";
  2. getline <"-";
  3. ip=$1*2^24+$2*2^16+$3*2^8+$4;sip=$0}

  4. (int(ip/2^(32-$5))==int(($1*2^24+$2*2^16+$3*2^8+$4)/2^(32-$5))){print sip" is in the list",$0;got=1;exit(0)}

  5. END{if(!got)print sip" is not in the list" } ' cncip
复制代码

论坛徽章:
0
24 [报告]
发表于 2007-05-12 11:01 |只看该作者
修改后。
  1. awk -F'/' 'function initMaskTable(i){

  2.         _maskCount = 0;

  3.         while ((getline < "mask") > 0) {
  4.                

  5.                 mask = ipToNumber($1);

  6.                 if (mask) _masks[_maskCount++] = mask;
  7.         }
  8. }

  9. function ipToNumber(pIP, i){

  10.         if (split(pIP, arrMask, ".") != 4) return 0;

  11.         result = arrMask[1];
  12.         for (i = 2; i <= 4; i++) result = or(lshift(result, SHIFT_BITS), arrMask[i]);

  13.         return result;
  14. }

  15. function checkIP(pIP, i){
  16.        
  17.         ip = ipToNumber(pIP);
  18.         if (!ip) return 0;

  19.         for (i = 0; i < _maskCount; i++) if (checkMask(_masks[i], ip)) return 1;

  20.         return 0;
  21. }

  22. function checkMask(pMask, pIP){

  23.         return and(pMask, pIP) == pMask;
  24. }

  25. BEGIN {
  26.         SHIFT_BITS = 8;
  27.         initMaskTable();
  28. }

  29. {
  30.         print $0 ": " (checkIP($0) ? "OK" : "FALSE");
  31. } urfile
复制代码

论坛徽章:
8
摩羯座
日期:2014-11-26 18:59:452015亚冠之浦和红钻
日期:2015-06-23 19:10:532015亚冠之西悉尼流浪者
日期:2015-08-21 08:40:5815-16赛季CBA联赛之山东
日期:2016-01-31 18:25:0515-16赛季CBA联赛之四川
日期:2016-02-16 16:08:30程序设计版块每日发帖之星
日期:2016-06-29 06:20:002017金鸡报晓
日期:2017-01-10 15:19:5615-16赛季CBA联赛之佛山
日期:2017-02-27 20:41:19
25 [报告]
发表于 2007-05-12 11:05 |只看该作者
来个awk的

  1. awk 'BEGIN{ FS="[./;]";printf "Input an IP: "; getline <"-"; ip=$1*2^24+$2*2^16+$3*2^8+$4;sip=$0}
  2. (int(ip/2^(32-($5)?$5:32))==int(($1*2^24+$2*2^16+$3*2^8+$4)/2^(32-($5)?$5:32))){print sip" is in the list",$0;got=1;exit 0}
  3. END{if(!got)print sip" is not in the list" } ' cncip
复制代码

论坛徽章:
0
26 [报告]
发表于 2007-05-12 14:49 |只看该作者
真是个个精彩,大长见识了!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP