perl中的ip匹配

时间:2015-01-28 06:06:39

标签: regex perl ip pattern-matching

我的IP地址为129.115.50.255

我有tcpdump文件,我正在尝试打印出来 除了包含IP地址的所有行。

我的代码就是

open(IN, "$ARGV[0]");
while($line = <IN>){
   next if /129\.115\.50\.255/;
   print $line, "\n";
}
close(IN1);

我无法打印出预期结果。谁能帮忙 我理解正确的语法或方法是什么?

4 个答案:

答案 0 :(得分:3)

问题是您已将输入分配到$line,因此您的测试也必须针对$line完成。

open(IN, "$ARGV[0]");
while($line = <IN>){
    chomp($line);
    next if $line =~ /129\.115\.50\.255/;
    print $line, "\n";
}
close(IN);

修正了最后的结果,您close(IN1)没有close(IN)。还在输入上添加了chomp以消除输出上的额外换行符。

答案 1 :(得分:2)

如果你想匹配&#34;确切&#34;字符串,然后regex真的不需要。相反,您可以使用index来确定您的字符串是否为该行的子字符串。

while (<>) {
    print unless (index $_, "129.115.50.255") != -1;
}
如果提供的第二个参数是第一个参数的一部分,

index将返回0或正整数...否则返回-1 ...所以这就是说print every line unless "129.115.50.255" is part of the line。作为额外的奖励,index通常比正则表达式匹配更快,因为它使用更少的资源。

使用索引的缺点是您必须小心IP地址中的最后一个八位字节,因为它正在寻找任何子字符串。假设您要过滤掉129.115.50.2,您还会过滤掉129.115.50.200.212.255等。您可以通过添加空格(或其他例如,在IP地址之后,deimeter出现在日志文件中)。 index $_, "129.115.50.2 "

如果你想使用正则表达式,手动转义点是很烦人的。让perl为你和print $line unless $line =~ quotemeta("129.115.50.255")

P.S。 while (<>)基本上是open File, $ARGV[0]; while (<File>)

的简写

答案 2 :(得分:0)

^(?!.*\b\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}).*$

你可以简单地使用它。这使用lookahead来确保行没有IP地址。参见demo.Do匹配每一行。

https://www.regex101.com/r/bC8aZ4/19

答案 3 :(得分:0)

您已经获得了有关如何修复perl代码的足够答案,但如果您有tcpdump生成的二进制文件,则无法像纯文本一样对其进行过滤。您需要一个知道如何读取pcap文件格式的应用程序。您可以使用tcpdump读取数据包捕获并过滤ip:

tcpdump -nr your_file.pcap host not 129.115.50.255