ログファイルなど、形式が決まったファイルからエラーコードや特定のキーワードを含む行を見つけて情報を取得するための正規表現のサンプルコードです。
入力データと出力例
ログファイルの例
INFO(I056): Application started
ERROR(E234): Database connection failed
INFO(I078): Processing started
ERROR(E398): File read error
INFO(I099): Process completed
出力例(発生したエラーのみ表示。形式を変更している)
エラーコード:234
Database connection failed
エラーコード:398
File read error
サンプルコード
以下のサンプルは、引数で与えられたログファイルを1行ずつ調査し、正規表現の条件に合う行の情報を抜き出します。
#!/usr/bin/perl
use strict;
use warnings;
# 引数でログファイルのパスを取得
my $logfile_path = $ARGV[0];
# ファイルを読み込みモードで開く
open( LOG_FILE, '<', $logfile_path ) or die( "Cannot open file: $!" );
# ファイルを一行ずつ読み込む
while (my $line = <LOG_FILE>) {
# エラーメッセージを検索する正規表現 ★
if ($line =~ /ERROR\((E\d+)\): (.*)/) {
# エラーコードとメッセージを抽出
my $error_code = $1;
my $error_message = $2;
# エラーコードとメッセージを出力
print "エラーコード:$error_code\n";
print "$error_message\n\n";
}
}
# ファイルを閉じる
close( LOG_FILE );
- プログラムの基本設定:
- use strict; と use warnings; を使用して、コードの正確性と安全性を向上させます。これらは、変数の誤用やプログラムの潜在的な問題を警告してくれます。
- ファイルのオープン:
- open( LOG_FILE, ‘<‘, $logfile_path ) or die( “Cannot open file: $!” ); で、指定されたログファイルを読み込みモードで開きます。ここでは古いスタイルのファイルハンドラLOG_FILEを使用しています。ファイルが開けない場合は、プログラムがエラーメッセージを出力して終了します。
- ファイルの読み込み:
while (my $line = <LOG_FILE>) { ... }
で、ファイルから一行ずつ読み込みます。このループは、ファイルの終わりまで各行に対して繰り返されます。
- エラーメッセージの抽出:
- if ($line =~ /ERROR(E(\d+)): (.)/) { … } は、正規表現を使用してエラーメッセージの行を検出します。ここでERROR(E(\d+)): (.)は、”ERROR”という文字列に続くエラーコード(Eに続く数字)とエラーメッセージを抽出するためのパターンです。
- エラー情報の出力:
- 抽出したエラーコード($error_code)とエラーメッセージ($error_message)を、print関数を使用して出力します。
- ファイルのクローズ:
- close(LOG_FILE); で、ファイルハンドラを閉じます。これはリソースの適切な解放を保証し、プログラムの整合性を維持します。
まとめ
本記事では、Perlを使用して、ログファイルなど、形式が決まったファイルからエラーコードや特定のキーワードを含む行を見つけて情報を取得するための正規表現の使用方法を紹介しました。