• ベストアンサー

ログファイルの検索

たとえばログファイルに NO=1&TITLE=aa&MESSAGE=テスト1です<BR><BR><BR>ためし!!= NO=2&TITLE=aa&MESSAGE=テストの3です。<BR>TEST= というように入っていたとします。 HTMLファイルでもcgiファイルでもいいのですが、たとえば「1」と入力したら NO=1が検索されて表示されるようなものを作成するにはどのようにしたらいいのでしょうか? よろしくお願いします。 #perlです。

質問者が選んだベストアンサー

  • ベストアンサー
  • ShaneOMac
  • ベストアンサー率39% (356/898)
回答No.1

例えば NO=1& TITLE=aa&MESSAGE=テスト1です<BR><BR><BR>ためし!!= というようにデータ形式を1.件名、2.データのように一行毎に記録しておく。そうすると連想配列として拾っていったり、普通の配列型で拾っていっても基数行-偶数行でデータ処理ができます。検索にはindex関数を使います。 一行に一データにするならば、データに埋もれないように少し大きめの件名にしておき、index関数で検索します。 これだけですとコードのどの部分が分からないのか不明ですので、もう少し知りたいところを絞って書いた方が良いですね。

KODAMAR
質問者

お礼

回答ありがとうございます。 ひとつめの提案の方法がちょっとわからないので2つ目の方ので考えてみました。 >データに埋もれないように少し大きめの件名 というのは他の項目と絶対にかぶらないデータということでよろしいでしょうか? 実際には日付&タイトルというような形にしようと思っていますので大丈夫かと思います。 入力.html      ↓   ↓  (1)データを入力   ↓ データ.log  (2)へデータが入る。 検索.html   ↓   ↓  (3)番号を入力   ↓  (4)データ.logオープン   ↓  (5)番号と一致するものを探す   ↓ 結果.html  (6)へデータをはきだす。 というような流れにしようと思っています。 わからないのは(5)と(6)のところです。

KODAMAR
質問者

補足

すいません、教えていただいたindexを使用してみようみまねでやってみたのですが…。 #ファイルオープン open FILE,"<log.log"; flock(FILE,2); @log_data=<FILE>; flock(FILE,8); close FILE; $kensakuchi = "1119"; $position = index $kensakuchi, @log_data; print "Content-type:text/html\n\n"; print "$position\n"; としてみましたが…ダメでした。 一部分のみでの検索はダメなのでしょうか? 最終的にはその検索して出てきたところの1行をはきだすまでをしたいのです。 よろしくお願いします。

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • ShaneOMac
  • ベストアンサー率39% (356/898)
回答No.2

関数について説明したページはたくさんあるので検索してみてください。 http://homepage2.nifty.com/sak/w_sak3/doc/sysbrd/pe_k05.htm http://www.kent-web.com/perl/chap9.html http://www5a.biglobe.ne.jp/~n_rieko/perl/right.htm ログの検索方法についてはここにも説明があります。 http://www7.big.or.jp/~jawa/perl/search.html $position = index $kensakuchi, @log_data; これでは検索対象が配列変数になっています。スカラー変数じゃないとダメですよ。index関数の用途が全く違う方向に行っています。 @log_data[$i] 例えばfor文で$iを増やしながら、対象をこのように配列要素としてスカラー変数にして検索しましょう。見つからなかったら返値は-1ですから、同じループの中にif文を付けておいて、-1が返らなかった場合(頭に見つかれば0が返るのであるいはそれ)を条件として、見つかった位置でループを抜けます。その位置の$iが探しているデータの場所です。 連想配列を使わないにしても、件名行-データ行で交互に構成しておくと検索しやすいですし、データの中に件名が混ざるような場合も問題になりません。 --------------- indexは扱いやすい検索関数ですが、一つ問題があります。indexでは検索文字列が対象の中に含まれていればその位置を返すようになっています。検索文字列より長い文字列中からそれを見つけるためのものですから、対象と完全一致するか比べる関数ではありません。 abc123 を対象として、abcで検索すれば0が返りますし、123で検索すれば3が返ります。いずれにしても見つかったという報告になります。bで検索したり2で検索しても含まれている限り見つかったことになります。 1,2,3,10,12 という配列で1を検索したら1と10と12のところで見つかることになります。ですからこれを使ってデータ中から検索を行う場合にはデータ構成を注意してください。

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • ファイルから検索

    ファイルを読み取って、検索し、結果を表示するプログラムを考えましたが、検索結果が全てのデータとなってしまいます。どう改善すれば良いのでしょうか? ファイル(mem.dat) あいこ29女性 唯21女性 裕樹23男性 <perlプログラム> #!c:/perl/bin/perl print "Content-type: text/html;\n\n"; require 'cgi-lib.pl'; &ReadParse(\%data); $kw=$input{'key'}; $n=0; #ファイル open (RF ,"mem.dat"); while($line=<RF>){ if((index $line,$kw)!=-1){ $n++; @data[$n]=$line; } } close(RF); print "<HTML><HEAD>\n"; print "<TITLE>検索結果ページ</TITLE>\n"; print "</HEAD><BODY>\n"; print "検索結果:$n件<BR>"; for($i=1;$i<=$n;$i++){ print "@data[$i]<BR>"; } print "</BODY></HTML>\n"; exit; 実行すると↓ 検索結果:3件 あいこ29女性 唯21女性 裕樹23男性

    • ベストアンサー
    • Perl
  • ファイルのアップロードとログ

    今日はいつもお世話になっています。 ファイルをアップロードをする際についでにログに名前やアドレス、ファイル名をログに 保存したいなと思っているのですが、なかなかうまくいきません・・・ ファイルをアップロードすることは出来たのですがほかの内容をうまくCGIに渡せなくって 困っています。 どうか宜しくお願いいたします。 use lib './lib'; use CGI_Lite; require 'lib/util.pl'; require 'pl/cgi-lib.pl'; require 'pl/jcode.pl'; $Title = 'ファイルのアップロード サンプル'; $Temp = 'tmp'; $Platform = 'Unix'; $BUFSZ = 2048; $CharSet = 'Shift_JIS'; $upload = new CGI_Lite; $upload->set_directory($Temp) or exitError(" $Temp がオープンできません。"); $upload->set_platform($Platform); $upload->set_buffer_size ($BUFSZ); $filename = $upload->filter_filename(\&convName); $upload->close_all_files; %data = $upload->parse_form_data; if ($upload->is_error()) { exitError($upload->get_error_message());} &ReadParse( *answer ); $num = $answer{'num'} $nam = $answer{'nam'}; $mai = $answer{'mai'}; $file = $answer{'file'}; print <<"EOL"; <HTML><HEAD><TITLE></TITLE></HEAD> <BODY> 整理番号  :$num<br> 名前    :$nam<br> アドレス  :$mai<br> 添付ファイル:$file<br> </BODY> </HTML> EOL exit(0);

    • ベストアンサー
    • CGI
  • データベース検索を作成、テスト中のエラーを解説していただけませんか?

    CGI初心者です。データベースを検索するCGIを作成というか、フリーであったものをカスタマイズし、自分の端末にてテスト中です。まずは、データ入力をして検索機能を確認しようとおもい、入力すると、 Write Error:./db.log と表示されました。そもそもログファイルとは?というのと、どうしたら入力できるようになるのか教えていただけませんか?

    • ベストアンサー
    • CGI
  • ファイルのアクセスログを知りたいのですが

    Wiindows2000の自宅サーバーについて質問です。 タイムカードのようなcgiがあり、1日に2回、アクセスがあってログが 書き換えられます。 例えばNo.001の人は、2007年1月1日に以下のようなファイルを朝作成して 朝のアクセス時刻を手入力により記録、また夕方には帰りの時刻を手入力 により記録しています。 cgi\log\001\070101.dat  この中身は 「9<>00<>17<>00<>社内業務<>」 のようになっています。 この、1日2回のアクセス時刻を管理したいのですが、ファイルの検索で、 2007/1/1に修正されたファイルを検索すると、更新日時は最後にアクセス された夕方の時刻でしかわかりません。 このファイルにいつアクセスされたか、朝と夕方の正確な時刻がわかるような ログは、どこかに残っているのでしょうか。 ご教示よろしくお願いします。

  • CGIの中で出力するテキスト内容をhtml側で表示する方法。

    htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、 print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。 今やって失敗している方法です。どのようにするのが良いか教えて頂ければ幸いです。 1.CGIスクリプト(Perlで記述)を用意... test.cgi ----------------------------------------------------- #!/usr/bin/perl print "Content-type:text/html; charset=shift_jis\n\n"; print <<__EOD; <html lang="ja"> <head> <title>TITLE</title> </head> <div align=center> <a>テスト1</a><br> <a>テスト2</a><br> </div><br> </body></html> __EOD open(OUT,">a.tmp") || die "$!"; print OUT "aaaaa\n"; close(OUT); ----------------------------------------------------- 2.htmlを用意 ... test.html ----------------------------------------------------- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN"> <html> <head> <title>HTML TEST</title> </head> <body> <script src="http://xxx/CGI/test.cgi"></script> </body> </html> ----------------------------------------------------- 上記のとき、動作として、 ◆ブラウザからCGIのパス(http://svr1/CGI/test.cgi)に直接アクセスした場合、 「テスト1」「テスト2」の文字が表示され、a.tmpファイルも作成されている。 ◆ブラウザからhtml(http://svr1/test.html)にアクセスした場合、ブラウザ画面は何も表示されない (真っ白となる)が、a.tmpファイルは作成されている。 のようになってしまいます。 後者のようにして、htmlからCGIファイルを呼び出すと、そのCGIは動作はしているようですが、 print等でhtml形式で文字出力させている部分は、ブラウザ内に表示されません。 以上、よろしくお願い致します。

    • ベストアンサー
    • CGI
  • CGI/perlのエラー

    CGIのテストをしています。 サーバーはUbuntu14.04 htmlで <html> <head><title>HTMLサンプル</title></head> <body> ボタンサンプル<br> <form action="cgi-bin/test.cgi" method="post"> <button type="button">ボタン</button><br> <input type="submit" value="送信"> </form> </body> </html> test.cgi #!/usr/bin/perl system = ("date >> webwrite""); 実行すると End of script output befor heads: test.cgi のエラーで止まってしまいます。 ファイル webwriteは作成されています。 何か、終了処理が必要なもでしょうか?

  • ログファイルからキーワードを検出、何行目か返す。

    以前こちらでおなじような質問をして回答いただいたのですが、どうしても理解できないので再度質問させていただきます。 フォームで名前や件名などを入力してもらい、その入力データをログファイルへ入れます。 ログファイルは以下のような感じのものが何行も続いています。 NAME=hoge&TITLE=tatoeba&NAKAMI=konnnakanji&LOCALTIME=20030127094224= (LOCALTIMEだけは自動で入るようになっています。) その後で、このログファイルから任意の行を取り出したいのですが、削除されることもあるため○行目という値では意図するものが出てこない可能性もあるので、 LOCALTIMEで検索をしたいのです。 20030127094224と入れた場合、ログファイルの○行目、と判定するようなことをしたいのです。 どのようにしたらいいのかさっぱりわかりません。 よろしくお願いします。 #perlです。

    • ベストアンサー
    • CGI
  • エラー表示の意味を解説してください

    CGI初心者です。自分の端末でサーバ設定し、テスト中の段階です。htmlファイルはブラウザからきちんと表示されました。が、CGIファイルを表示させようとすると、 CGI エラー - Content-Type ヘッダが正しくありません。 CGI 出力メッセージ: Can't open perl script "C:\www\hiro\ISO": No such file or directory とエラーがでます。ちなみに、スクリプトには #!/usr/bin/perl print"Content-type: text/html\n\n"; print"<HTML>\n"; print"<HEAD>\n"; print"<TITLE>CGI No1</TITLE>\n"; print"</HEAD>"; print"<BODY>\n"; print"CGIプログラム No.1,テスト成功!\n"; print"</BODY>\n"; print"</HEAD>\n"; と記述しました。なにがいけないのか教えてください。

    • ベストアンサー
    • CGI
  • error_logファイルの中身で教えて・・「 Premature end of script headers: 」

    Perl初心者です。 Perlでスクリプトを書いてます。 うまく動かないのでerr_logファイルを見ると下記の内容になっています。 [error] (2)No such file or directory: exec of /home/***/***.cgi failed [error] [client **.**.**.**] Premature end of script headers: home/***/***.cgi これは何を意味しているのでしょうか?(何処が悪いのでしょうか)教えて下さい。

    • ベストアンサー
    • Perl
  • テキストファイル内の変数を展開して出力したい

    テキストファイル内に変数を書いておいて、出力時に その変数を展開させる方法を教えてください。 具体的には、[test.txt]を[出力]のようにしたいのです。 ためしに[test.cgi]を作ったのですが[test.txt]の内容がそのまま出てきてしまいました。 [test2.cgi]ができるなら、[test.cgi]でもできると思っていたのですが… [test.cgi] #!/usr/local/bin/perl $moji="OK"; print "Content-type: text/html\n\n"; open(IN, 'test.txt'); while (<IN>) { print "$_"; } close(IN); exit; [test2.cgi] #!/usr/local/bin/perl $moji="OK"; $naka="<HTML><BODY>$moji</BODY></HTML>"; print "Content-type: text/html\n\n"; print "$naka"; } close(IN); exit; [test.txt] <HTML><BODY>$moji</BODY></HTML> [出力] <HTML><BODY>OK</BODY></HTML>

    • ベストアンサー
    • Perl
製品をアプリに登録できない
このQ&Aのポイント
  • 製品をアプリに登録する方法がわからない
  • 製品をアプリに登録する際にエラーが発生してしまう
  • 製品をアプリに登録するための環境設定が必要
回答を見る