問題があるように思われるのは、ポートがキャプチャされている場所とハッシュ更新がわからないことです。 $LogRecord =~
ラインは、パターンをキャプチャしていること - - $1
と$2
に何が起こっている
は、あなたのwhile
ループが一度にファイル1行を反復し、値をキャプチャされています。
そして$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;
これでハッシュが構築されました。
しかし、それはoutputingに来る:
foreach my $ip (keys %ports_from) {
print "$ip: ", join (" ", @{$ports_from{$ip}}) ,"\n"
}
あなたがそれらを並べ替えしたい場合は、sort
を使用してこれを実行する必要があります。
今、sort
はかなり巧妙な機能ですが、デフォルトでは英数字でソートされています。それは... IPアドレスやポート番号に関しては実際にはそれほど有用ではありません。なぜなら、それらをより数値的に並べ替えたいからでしょう。簡単な答えはSort::Naturally
で、nsort
を使用してください。
ただし、 - sort
は、相対位置に応じて-1,0,1を返す関数(デフォルトはcmp
)をとります。
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";
}
あなたを与える:
IPツー考える
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
コメントはあなたの投稿をうまくフォーマットしないでください。 – Sobrique