むかし(2007年8月7日)作ったログデータ検索用phpスクリプト公開しておきます。
メリットとしては
- GZファイルのままでも検索できる
- 1行ずつ読み込んでヒットしたら書き出すのでメモリを使わない?
- 複数キーワードで検索できる
以下をgzgrepor.phpなど適当なファイル名で保存して、
php gzgrepor.php [ファイル名] [キーワード1] ...
というように実行すると、キーワードでgrepした結果のファイルが作成されるものです。
キーワードは半角スペース区切りで複数指定できます。or検索ができるってところでしょうか。スペースも含むキーワードの場合はダブルコーテションで囲んで下さい。(windowsだけかも?)
このphpファイルをどこかに置いてパス通しておくと便利かもしれないけどまだ試したことない。
まだまだブラシュアップするところあると思いますのでアドバイスお待ちしております。
他にもnot検索させるのも作ったりしてます。
gzgrepor.php
<?php
// 引数チェック
if ($argc < 3) {
print "引数が不正です。\n";
exit;
}
// 解析対象ファイル名取得
$filename = $argv[1];
// $keyword = $argv[2];
// 検索結果出力ファイル名
$dfilename = preg_replace("/\.log\.gz$/","",$filename);
$dfilename = $dfilename . "_" . $keyword . ".txt";
//情報出力
print "検索対象ファイル :";
print $filename . "\n";
print "検索対象キーワード :";
print $keyword . "\n";
print "検索結果出力ファイル:";
print $dfilename . "\n";
//gzファイルオープン
$zh = gzopen($filename,"rb");
if ($zh == false) {
print "gzファイルのオープンに失敗しました。\n";
exit;
}
// 出力ファイルオープン
$fp = fopen($dfilename,"wb");
if ($fp == false) {
print "出力ファイルのオープンに失敗しました。\n";
exit;
}
// 検索キーワード取得
array_shift($argv);
array_shift($argv);
$cnt = 0;
while (gzeof($zh) == false) {
// 1行取得
$line = "";
$line = gzgets($zh);
$flg = 0;
foreach ($argv as $tmp) {
if (strstr($line,$tmp) != false && $flg == 0) {
fputs($fp,$line);
$cnt = $cnt + 1;
$flg = 1;
}
}
}
//出力ファイルクローズ
fclose($fp);
//gzファイルクローズ
gzclose($zh);
print "\n";
print "該当データは" . $cnt . "件ありました。\n";
print "\n";
print "処理が完了しました。\n";