겉보기에 문제가있는 것은 포트가 캡처되는 위치와 해시 업데이트가 확실하지 않다는 것입니다. $LogRecord =~
라인 패턴을 캡처되어 - - $1
및 $2
에 무슨 일
은 while
루프가 한 번에 파일 한 줄을 반복하고 값을 캡처합니다.
$2
은 push
으로 해시에 추가 할 수있는 항목입니다.
그러나 더 나은 스타일이므로 어휘 파일 핸들을 사용하는 것처럼 스타일을 현명하게 변경 한 몇 가지 사항이 있습니다.
#!/usr/bin/env perl
use warnings;
use strict;
#because it makes debugging easier.
use Data::Dumper;
my $LogRecordCount;
#declare some hashes;
my %ports_from;
my %ips_that_used;
open my $logfile, "sample.log.txt" or die "couldn't open sample.log.txt";
while (my $line = <$logfile>) {
#matches 'current line' - skips stuff that doesn't match.
next unless $line =~ /INext-DROP/;
#increment count.
$LogRecordCount++;
my ($source, $src_port) = $line =~ m/SRC=([0-9\.]+).*SPT=([0-9]+)/;
print "$source$sport";
#not sure what this is doing, so I have left it in.
print substr($line , 0 , $ARGV[1]) , "\n" if $ARGV[1];
push @{$ports_from{$source}}, $src_port;
push @{$ips_that_used{$src_port}}, $source;
}
print "The file contained $LogRecordCount records" if $ARGV[1];
close $logfile;
print Dumper \%ports_from;
print Dumper \%ips_that_used;
이렇게 해시가 만들어졌습니다.
그러나하고 출력하기에 올 때 :
foreach my $ip (keys %ports_from) {
print "$ip: ", join (" ", @{$ports_from{$ip}}) ,"\n"
}
당신이 그들을 정렬 원한다면, 당신은 sort
를 사용하여이 작업을 수행해야합니다.
지금 sort
은 매우 영리한 기능이지만 기본적으로 영숫자 정렬입니다. 그건 ... IP 주소 나 포트 번호와 관련하여 실제로 유용하지는 않습니다. 왜냐하면 IP 주소 나 포트 번호를 수치 적으로 정렬하기를 원하기 때문입니다. 쉬운 대답은 Sort::Naturally
이고 nsort
을 사용하십시오.
그러나 - sort
은 상대 위치에 따라 -1, 0, 1을 반환하는 함수 (기본값은 cmp
)를 취합니다.
그래서 다음과 같을 수 'IP에 의해'정렬 :
sub by_ip {
my @a = split /\./, $a;
my @b = split /\./, $b;
foreach my $octet (@a) {
my $comparison = $octet <=> shift (@b);
return $comparison if $comparison;
}
return 0;
}
을 그리고 당신은 할 수 :
foreach my $ip (sort by_ip keys %ports_from) {
print "$ip: ", join (" ", sort { $a <=> $b } @{$ports_from{$ip}}),"\n";
}
당신에게주기 :
24.64.208.134 : 24128 24128 24128
71.228.199.109 : 37091
72.197.8.56 : 9258
75.117.31.43 : 3122
99.248.20.48 : 48725
207.68.178.56 : 80
의 IP 간을 감안할 때 포트 매핑을 사용하면 중복이 존재하지만 해시 대신 해시 해시를 사용하여 포트 - 빈도를 계산하는 것이 더 좋습니다 f- 배열.
$count_ports_from{$source}{$src_port}++;
: 그리고
foreach my $ip (sort by_ip keys %count_ports_from) {
print "$ip: ";
foreach my $port_num (sort { $count_ports_from{$a} <=> $count_ports_from{$b} }
keys %{ $count_ports_from{$ip} })
{
print "\t $port_num : $count_ports_from{$ip}{$port_num}\n";
}
}
처럼 뭔가주기 : 당신은 절대적 과제에 대해 질문 할 수있는
24.64.208.134 : 24128 : 3
71.228.199.109 : 37091 : 1
72.197.8.56 : 9258 : 1
75.117.31.43 : 3122 : 1
99.248.20.48 : 48725 : 1
207.68.178.56 : 80 : 1
는 - 동일한 규칙하지만 '진짜'질문으로 적용됩니다. 예 : 우리는 귀하의 업무 (숙제 또는 기타)를하지 않을 것입니다. 문제를 이해하고 작업중인 코드를 수정하도록 도와 드리겠습니다. – Sobrique
붙여 넣기 된 로그 스 니펫 (스크린 샷에서 재구성 할 필요가 없음)은 테스트에 도움이됩니다. – Sobrique
댓글을 잘 작성하지 마세요. [edit] 게시물을 올려주세요. – Sobrique