1

テキスト ファイルから特定の情報セグメントを取得し、それを別のファイルに書き込もうとしています。以下はファイアウォールのログです。私にとって唯一の重要な情報は、「inside/」の後の IP アドレスとポート、および「outside/」の後の IP アドレスとポートです。

May 24 10:21:53 10.110.9.18 v3306 %FWSM-4-106100: access-list inside permitted tcp inside/10.110.27.5(53264) -> outside/172.23.240.2(1984) hit-cnt 1 (1-second interval) [0xee13216c, 0x0] 

May 24 10:21:53 10.110.9.18 v3306 %FWSM-4-106100: access-list inside permitted tcp inside/10.110.27.5(53265) -> outside/10.110.2.5(1984) hit-cnt 1 (1-second interval) [0xee13216c, 0x0] 

基本的に、出力は次のようになります。

10.110.27.5(53264) -> 172.23.240.2(1984)

重複を削除する方法があればいいですね。

4

2 に答える 2

4
perl -nE'@r= /(?:inside|outside)\/(\S+)/g and say join" -> ", @r' file

重複なし:

perl -nE'@r= /(?:inside|outside)\/(\S+)/g and !$s{"@r"}++ and say join" -> ", @r' file

また

perl -nE'
  @r= /(?:inside|outside)\/(\S+)/g;
  if (@r and !$s{"@r"}++) { say join" -> ", @r }
' file
于 2013-11-05T07:05:27.210 に答える
2

と の両方が同じ行にあるinsideと仮定します。outside次のようなループでファイルをスキャンして、一致を見つけることができるはずです。

open my $fh, "<", $logfile or die "can't open $logfile for reading\n";

my %seen;  # used for filtering dupes.

while (<$fh>)
{
    my $line = $_;

    if ($line =~ /inside\/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\([0-9]+\)).*outside\/([0-9]+\.[0-9]+\.[0-9]+\.[0-9]+\([0-9]+\))/)
    {
        my $hit = "$1 -> $2";
        print $hit, "\n" if (++$seen{$hit} == 1);
    }
}
close $fh;

私はそれがうまくいくと思います。

上記の正規表現が過度に具体的である可能性は十分にあります。次のコードには、もう少しリラックスしたコードがあります。

open my $fh, "<", $logfile or die "can't open $logfile for reading\n";

my %seen;  # used for filtering dupes.

while (<$fh>)
{
    my $line = $_;

    if ($line =~ /(inside.*outside[^)]*\))/)
    {
        my $hit = $1;
        $hit =~ s/(inside|outside)\///g;  # remove 'inside/' and 'outside/' from string.
        print $hit, "\n" if (++$seen{$hit} == 1);
    }
}
close $fh;
于 2013-11-05T07:09:59.900 に答える