perl中的ip匹配

ip matching in perl

我有一个 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);

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

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

您可以简单地使用 this.This 使用 lookahead 来确保行没有 ip address.See demo.Do 与每一行匹配。

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

问题是您将输入分配给 $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 以消除输出上的额外换行符。

如果你想匹配一个 "exact" 字符串,那么正则表达式并不是真正需要的。相反,您可以使用 index 来确定您的字符串是否是该行的子字符串。

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

index 将 return 为 0 或正整数...否则它 return 为 -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,等等。您可以通过附加 space 来解决这个问题](或日志文件中出现的任何分隔符)在 IP 地址之后,例如。 index $_, "129.115.50.2 "

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

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

的缩写

您已经获得了关于如何修复 perl 代码的足够答案,但是如果您有一个由 tcpdump 生成的二进制文件,您就不能像纯文本一样过滤它。您需要一个知道如何读取 pcap 文件格式的应用程序。可以使用tcpdump读取抓包,过滤ip:

tcpdump -nr your_file.pcap host not 129.115.50.255