分析DHCP日志,根据MAC取出相对应的网关IP....

分析DHCP日志,根据MAC取出相对应的网关IP....

现在有这样的需求:
有一台DHCP服务器,为数字电视机顶盒用户提供DHCP服务.

有一文本文件,包括MAC地址(比如200个,就是200行),现在根据文本文件中的MAC,逐一匹配DHCP日志,取出对应的网关IP.

如:
DHCP日志如下:
Apr 8 16:41:30 dhcp03 dhcpd: DHCPDISCOVER from 52:54:4c:24:49:aa via 10.204.208.1
Apr 8 16:41:30 dhcp03 dhcpd: DHCPOFFER on 10.204.212.157 to 52:54:4c:24:49:aa via 10.204.208.1
Apr 8 16:41:30 dhcp03 dhcpd: DHCPREQUEST for 10.194.117.180 (218.108.236.11) from 000:33:00:19:ef via 10.194.112.1
Apr 8 16:41:30 dhcp03 dhcpd: DHCPACK on 10.194.117.180 to 000:33:00:19:ef via 10.194.112.1


见以上大字体,52:54:4c:24:49:aa对应IP 10.204.208.1,则将 52:54:4c:24:49:aa 10.204.208.1 输出到另一文本文件.

我想了下,没有想出来,请教各位.

#!usr/bin/perl

use strict;
use warnings;

my $input="/home/gaochong/perl/input";
my $output="/home/gaochong/perl/output";
my $log="/home/gaochong/perl/log";
open I,"$input";
open O,"> $output";
open L,"$log";
while (<I> {
        while (<L>{
                if ($ =~

这里的 $ 我就没办法做下去了.......
希望各位指教.
#!/usr/bin/perl


use strict;
use warnings;

while (<DATA>) {
    print "$1 $2\n" if (/DHCPDISCOVER \w+ (.{2}:.{2}:.{2}:.{2}:.{2}:.{2})\D*(\d+\.\d+\.\d+\.\d+)/)
}

__DATA__
Apr 8 16:41:30 dhcp03 dhcpd: DHCPDISCOVER from 52:54:4c:24:49:aa via 10.204.208.1
Apr 8 16:41:30 dhcp03 dhcpd: DHCPOFFER on 10.204.212.157 to 52:54:4c:24:49:aa via 10.204.208.1

谢谢.
但是,我现在的需求是,根据某个文本文件中的MAC(200行)取出对应的IP.
以下是我的代码和出现的错误,请指教!!谢谢!

[root@cns perl]# cat 1.pl
#!/usr/bin/perl

use strict;
use warnings;

my $input="/home/gaochong/perl/input";
my $output="/home/gaochong/perl/output";
my $log="/home/gaochong/perl/log";

open I,"$input";
open O,"> $output";
open L,"$log";

while (<I>) {
        my $s=chomp $;
        while (<L>) {
                if (/DHCPDISCOVER from $s via (\d+.\d+.\d+.\d+)/) {
                        print O $s,$1.
                        print "\n";
                }
        }
}
close I;
close L;
close O;
[root@cns perl]# ./1.pl
syntax error at ./1.pl line 16, near ") {"
Global symbol "$s" requires explicit package name at ./1.pl line 17.
Global symbol "$s" requires explicit package name at ./1.pl line 18.
syntax error at ./1.pl line 21, near "}"
Execution of ./1.pl aborted due to compilation errors.
[root@cns perl]#



QUOTE:
原帖由 gaochong 于 2008-4-10 09:09 发表
谢谢.
但是,我现在的需求是,根据某个文本文件中的MAC(200行)取出对应的IP.
以下是我的代码和出现的错误,请指教!!谢谢!

[root@cns perl]# cat 1.pl
#!/usr/bin/perl

use strict;
use warnings;

my ...

你那$s是什么玩意?
注意看出错的提示
里面都写的清清楚楚了
log是用来看的
不是用来贴的
恩.
$s 是按照我的思路,读取文本文件中的一行(也就是一个MAC)并chomp.

但我没有调试出来....

请问我的思路是否正确?谢谢各位!


QUOTE:
原帖由 gaochong 于 2008-4-10 09:23 发表
恩.
$s 是按照我的思路,读取文本文件中的一行(也就是一个MAC)并chomp.

但我没有调试出来....

请问我的思路是否正确?谢谢各位!

我眼神不济
看错了
不好意思
你的问题在于

[Copy to clipboard] [ - ]
CODE:
my $s = chomp $;

错误有二:
1. chomp的返回值不是0就是1,你付给$s没有意义
2.chmop $ 应该是chmop $_吧?
更好的写法是

[Copy to clipboard] [ - ]
CODE:
chomp(my $s= $_);

还有你的正则表达也是错误的
.是一个metacharacter,必须要back slash之
写成

[Copy to clipboard] [ - ]
CODE:
\.

这一段

[Copy to clipboard] [ - ]
CODE:
while (<I>) {
        my $s=chomp $;
        while (<L>) {
                if (/DHCPDISCOVER from $s via (\d+.\d+.\d+.\d+)/) {
                        print O $s,$1.
                        print "\n";
                }
        }
}

写的太problematic了,我的思路是
log文件就没有必要了吧,直接两个文件,一个
$input表示输入文件句柄
一个
$output表示输出文件句柄


[Copy to clipboard] [ - ]
CODE:
while(<$input>){
  next if not /DHCPDISCOVER from (.+?) via (.+)$/;
  print $output "$1 $2\n";
}

哎呀....傻了,最最基础的都错了,不好意思.


以下是我改过的代码,已经成功了.
但还有其他需求,我再自己写写.肯定会有问题,到时我再贴出来.
谢谢各位.

#!/usr/bin/perl

use strict;
use warnings;

my $input="/home/gaochong/perl/input";
my $output="/home/gaochong/perl/output";
my $log="/home/gaochong/perl/log";

open I,"$input";
open O,"> $output";
open L,"$log";

while (<I>) {
        chomp (my $s=$_);
        while (<L>) {
                if (/DHCPDISCOVER from $s via (\d+.\d+.\d+.\d+)$/) {
                        print O $s . "   " . $1 . "\n";
                }
        }
}
close I;
close L;
close O;
另外,如何把 没有匹配成功的MAC也写到文本文件中,格式如下:
mac   none

谢谢!

#!/usr/bin/perl


use strict;
use warnings;

chomp (my $month=`date +%b`);
chomp (my $day=`date +%d`-1);

my $input="/home/gaochong/perl/mac_format";
my $output="/home/gaochong/perl/result";
my $log_s="/home/gaochong/dhcp.log";
my $log="/home/gaochong/dhcp.log2";

open L_S,"$log_s";
open L,"> $log";
while (<L_S>) {
        print L $_ if (/$month\s+$day/);
}
close L_S;
close L;

open I,"$input";
open O,"> $output";
open L2,"/home/gaochong/dhcp.log2";

while (<I>) {
        chomp (my $s=$_);
        while (<L2>) {
                if (/DHCPDISCOVER from $s via (\d+.\d+.\d+.\d+):/i) {
                        print O $s . "   " . $1 . "\n";
                        last;
                }
        }
}
close I;
close L2;
close O;