免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1876 | 回复: 3
打印 上一主题 下一主题

正规表达式和模式匹配的问题(请高手给个意见) [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2006-07-25 20:17 |只看该作者 |倒序浏览
近期写一个取局域网MAC地址和IP地址的程序,遇到了困难,得到了这里很多高手的帮助,非常的感谢。不过小弟我不争气,由于时间比较紧,对perl也是刚学习,自己虽然看过一段书之后就写程序,但总遇到新问题,只好麻烦大家再帮助看看了。

问题:
我用Nmap扫描网络得到一个输出,类似于这样。

Starting nmap 3.93 ( http://www.insecure.org/nmap ) at 2006-07-25 18:43
Host 192.168.116.1 appears to be up. #IP地址
MAC Address: 00:0D:02:123:B2 (NEC Access Technica) #MAC地址
Host 192.168.116.3 appears to be up.
MAC Address: 00:0D:02:12:A5:B2 (Cisco)
Host 192.168.116.5 appears to be up. #自己的主机,所以下面不显示MAC地址
Host 192.168.116.6 appears to be up.
MAC Address: 00:0F:02:12:A5:B2 (IBM)

。。。。。。
Nmap finished: 256 IP addresses (2 hosts up) scanned in 6.500 seconds

我想用perl把IP地址和MAC地址给抓出来。然后IP存到一个数组,MAC存到一个数组。但是他们的index必须是对应的,也就是说IP[5]里面存的ip地址的MAC地址存到 MAC[5]里面。(如果是自己的主机,那么相应的MAC[index]我想里面存一个localhost这个字符)。

我的程序这样写

$Cmd = "Nmap -n -sP 192.168.116.0\/24";
open MYFH, ">./addresslist.txt" ;

@tmp = `$Cmd`;

@IP;
@MAC;
$indexip=0;
$indexmac=0;

foreach $line (@tmp){
    if($line=~/Host ([\d\.]+)/){
        $IP[$indexip]=$1;
        $indexip++;        
    }elsif($line=~/MAC Address: ([\dA-F\:]+)/){
        $MAC[$indexmac]=$1;
        $indexmac++;
    }
}

for($index=0;$index<@IP;$index++){
    print $IP[$index], "\t", $MAC[$index];
    print "\n";

}

输出
192.168.116.1     00:0D:02:123:B2
192.168.116.3     00:0D:02:12:A5:B1
.....
192.168.116.6


这样可以把IP和MAC都取出来,但是MAC和IP就不对应了,因为本机的IP没有MAC的输出,所以就错位了。
请大家帮助看看,我怎样写比较好,怎样把IP下面没有MAC的行的作处理比较好。(另外包括整个程序的构思,我想我写的比较笨,有不有什么更好的方法)。如果用Hash来做可不可以,怎样做?

[ 本帖最后由 dafeiniao 于 2006-7-25 20:20 编辑 ]

论坛徽章:
0
2 [报告]
发表于 2006-07-25 21:18 |只看该作者
原帖由 dafeiniao 于 2006-7-25 20:17 发表
......
我想用perl把IP地址和MAC地址给抓出来。然后IP存到一个数组,MAC存到一个数组。但是他们的index必须是对应的
....


Hello,

pls learn more about hash.

Tips:
1. you can put ip as key and mac as value in a hash
2. or use hashes of hashes. i.e.:
  1.    
  2.    %hash = (
  3.        '192.168.1.1' => ('mac' => '00:0a:02:dd:mm',
  4.                                    'hostname' => 'foo'),
  5.       '....' => (....),
  6.   );

复制代码



Best,
    ulmer

--------
Sommer is HOT but Per is COOL!

论坛徽章:
0
3 [报告]
发表于 2006-07-25 22:02 |只看该作者
我是要学习学习HASH,不过先最好能用数组给个解决方案吧。呵呵

[ 本帖最后由 dafeiniao 于 2006-7-25 22:04 编辑 ]

论坛徽章:
0
4 [报告]
发表于 2006-07-26 23:16 |只看该作者
OK, 仔细想了一下,用数组解决的方法有了,呵呵。

for($indextmp=0;$indextmp<@tmp;$indextmp++){
    if($tmp[$indextmp]=~/Host ([\d\.]+)/){
        $IP[$indexip]=$1;
        $indexip++;
        if($tmp[$indextmp+1]=~/MAC Address: ([\dA-F\:]+)/){
            $MAC[$indexmac]=$1;
            $indexmac++;
        }else{
            $MAC[$indexmac]="localhost";
            $indexmac++;  
        }
    }  
}

如果我用hash的话是不是也还是要遍历一次文本数组@tmp,只是在把匹配模式抓出来的IP地址和MAC地址往里往HASH里面存啊。 IP存成key,MAC存成value。 那位能写几句代码给看看
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP