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 与每一行匹配。
问题是您将输入分配给 $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
我有一个 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 与每一行匹配。
问题是您将输入分配给 $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