ログファイルからIPアドレスを抽出する

ログファイル(テキストファイル)からIPアドレスを取り出すperlのプログラムを紹介します。
例えばプロキシーサーバのログからアクセスしたIPアドレスの統計を取る場合など活用してください。
ログファイルが巨大な場合、Perlのみで作成するとメモリ不足が発生するため、bashとperlを組み合わせるなど工夫しています。

プログラムを簡略化するため、IPアドレスの判定は<3桁内数字>.<3桁内数字>.<3桁内数字>.<3桁内数字>で判定しています。
(よって999.999.999.999 などもIPアドレスとし抽出されるため、プログラムは改良の余地があります。)

2015年12月7日
Redhat EL 6.4で確認

スポンサード リンク

1.Perlのみで作成

以下のシェルでは /test/log.txt からIPアドレスを抽出します。
(先ほど記載したとおり、非IPアドレスも抽出されてしまいます。)

#!/usr/bin/perl

$textfile = "/test/log.txt";
open (I, "$textfile") or die "Failed to open: $textfile";
my @lines = <I>;
close I;
foreach (@lines)
{
chomp;
$u = $_;
print "$1\n" if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;
}

上記プログラムは log.txt が小さい場合は正常に動作しますが、/test/log.txt が巨大な場合は強制終了されてしまいます。

# ./test.pl
Killed(強制終了)

上記の通り、oom killer (Out of memory)によりプロセスが強制終了されてしまいます。
さらにfree でリソースを確認すると、mem(free)が急減しているのが分かります。

スポンサード リンク

2.bash シェルとperlを使用

oom kilerを回避すべく、bashからperlをコールする形式とします。

(a)test.sh

log.txtの内容をtest.plに渡すシェルを作成します。

#!/bin/bash

cat /test/log.txt | /test/test.pl

(b)test.pl

標準入力をテキストファイルの内容を受け取りIPアドレスを抽出するperlプログラムを作成します

#!/usr/bin/perl
while (<STDIN>) {
chomp;
$u = $_;
#print "$1\n";

print "$1\n" if /\b(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})\b/;
}

最後に、以下のコマンドにより、ソート、重複削除後にファイルに出力します。

./getip.sh | uniq |sort -i > result.txt

スポンサード リンク

[redhat linux 技術ドキュメント トップ]

[FAQ CENTER トップ]