我的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);
我无法打印出预期结果。谁能帮忙 我理解正确的语法或方法是什么?
答案 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匹配每一行。
答案 3 :(得分:0)
您已经获得了有关如何修复perl代码的足够答案,但如果您有tcpdump生成的二进制文件,则无法像纯文本一样对其进行过滤。您需要一个知道如何读取pcap文件格式的应用程序。您可以使用tcpdump读取数据包捕获并过滤ip:
tcpdump -nr your_file.pcap host not 129.115.50.255