ログファイル(テキストファイル)から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 トップ]