• 締切済み

ログデータが3行1セットで必ず出力される

お世話になります。 logsurferというログ監視ソフトを使ってログデータファイルから使用したい分だけデータを切り出したいです、最初は一つだけのPCのログを監視して、トラブルがありませんでした。 今から二つPCのログを監視しますので、元のソースがデータを判断してから切り出しところがトラブルが発生する事をありました。 トラブルは前のログデータを来てからソースの判断の時間はログの時間により遅くて間に合わないから、判断しずにのまま、次のログデータを上書かされました。 前のソース: #!/usr/bin/perl ###################read testlog################################# open(LOGFILE,'/var/log/testlog'); @logarray=(0,<LOGFILE>); close(LOGFILE); while (defined($logarray[$i])){ if((index($logarray[$i],"sshd") ne -1) and (index($logarray[$i],"Failed") ne -1)){ #print $i," "; $tty=0; $lastfail=$i; }elsif((index($logarray[$i],"failure") ne -1) and (index($logarray[$i],"tty=tty") ne -1)){ $tty=1; $lastfail=$i; } #print index($logarray[$i],sshd)," "; #print index($logarray[$i],Failed),"\n"; $i++; } #print "1 ",$lastfail,"\n"; open OUT,">rensyu4.txt"; print OUT $logarray[$lastfail]; close OUT; 今の発想はログデータがそのまま別のファイルの書き込んで、そして、そのファイルから三行ずつ切り出して判断してから別のファイルに書き込みたいです。 今のソース: #!/usr/bin/perl ###################read testlog################################# open(LOGFILE,"/var/log/testlog"); open(OUT,">testlog.txt"); my $last_data; while (<LOGFILE>){ print OUT $_ if ($last_data ne $_); $last_data=$_; } close OUT; close(LOGFILE); open(TESTLOG,"testlog.txt"); @logarray=(0,<TESTLOG>); close(TESTLOG); while (defined($logarray[$i])){ if((index($logarray[$i],"sshd") ne -1) and (index($logarray[$i],"Failed") ne -1)){ #print $i," "; $tty=0; $lastfail=$i; }elsif((index($logarray[$i],"failure") ne -1) and (index($logarray[$i],"tty=tty") ne -1)){ $tty=1; $lastfail=$i; } #print index($logarray[$i],sshd)," "; #print index($logarray[$i],Failed),"\n"; $i++; } #print "1 ",$lastfail,"\n"; open OUT,">rensyu4.txt"; print OUT $logarray[$lastfail]; close OUT; ログデータ: May 13 17:55:57 fc4-03 sshd[1403]: error: Could not get shadow information for plan May 13 17:55:57 fc4-03 sshd[1403]: Failed password for plan from ::ffff:10.42.42.131 port 3040 ssh2 May 13 17:55:58 fc4-03 last message repeated 2 times May 13 17:56:03 fc4-03 sshd[1406]: error: Could not get shadow information for ougun May 13 17:56:03 fc4-03 sshd[1406]: Failed password for ougun from ::ffff:10.42.42.130 port 1398 ssh2 May 13 17:56:08 fc4-03 last message repeated 2 times May 13 17:56:09 fc4-03 sshd[1412]: error: Could not get shadow information for plan May 13 17:56:09 fc4-03 sshd[1412]: Failed password for plan from ::ffff:10.42.42.131 port 3041 ssh2 May 13 17:56:09 fc4-03 last message repeated 2 times May 13 17:56:19 fc4-03 sshd[1415]: error: Could not get shadow information for ougun May 13 17:56:19 fc4-03 sshd[1415]: Failed password for ougun from ::ffff:10.42.42.130 port 1399 ssh2 May 13 17:56:19 fc4-03 last message repeated 2 times ログデータファイルから三行1セットで切り出したいです。 どなたか教えて頂けると助かります、宜しくお願いします。

  • Perl
  • 回答数1
  • ありがとう数1

みんなの回答

  • sakusaker7
  • ベストアンサー率62% (800/1280)
回答No.1

申し訳ないのですが、あなたの望んでいることが良くわかりません。 > ログデータファイルから三行1セットで切り出したいです。 たとえば貼り付けられているログデータを May 13 17:55:57 fc4-03 sshd[1403]: error: Could not get shadow information for plan May 13 17:55:57 fc4-03 sshd[1403]: Failed password for plan from ::ffff:10.42.42.131 port 3040 ssh2 May 13 17:55:58 fc4-03 last message repeated 2 times --ここで区切る-- May 13 17:56:03 fc4-03 sshd[1406]: error: Could not get shadow information for ougun May 13 17:56:03 fc4-03 sshd[1406]: Failed password for ougun from ::ffff:10.42.42.130 port 1398 ssh2 May 13 17:56:08 fc4-03 last message repeated 2 times --ここで区切る-- May 13 17:56:09 fc4-03 sshd[1412]: error: Could not get shadow information for plan May 13 17:56:09 fc4-03 sshd[1412]: Failed password for plan from ::ffff:10.42.42.131 port 3041 ssh2 May 13 17:56:09 fc4-03 last message repeated 2 times --ここで区切る-- May 13 17:56:19 fc4-03 sshd[1415]: error: Could not get shadow information for ougun May 13 17:56:19 fc4-03 sshd[1415]: Failed password for ougun from ::ffff:10.42.42.130 port 1399 ssh2 May 13 17:56:19 fc4-03 last message repeated 2 times と分けていって、それぞれの3行を別々のファイルに書けばいいのですか?

ch_rabbit
質問者

お礼

ご関心ありがとうございます。 申し上げございません、この問題は友達から教えて解けました。 今後ともご指導ください。

関連するQ&A

  • 指定行に書込み

    open( IN, "log.cgi" ); @f_data = <IN>; close( IN ); $i = '1'; open( OUT, ">dat.cgi" ); select OUT; print "document.open();\n"; print "document.write('"; foreach( @f_data ){ if( $i > 5 ){ last; } ( $f_data1, $f_data2, $f_data3, $f_data4 ) = split( /<>/ ); $f_data1 =~ s/ //g; print "$f_data1"; $i++; } print "');\n"; print "document.close();\n"; select STDOUT; close( OUT ); 上記スクリプトで、指定された行数、又は指定された場所でdat.cgiに 書き出したいのですが、どのように書けばよろしいのでしょうか? 例えば、 ・100行目に書き出す。 または、 ・指定された文字列の間に書き出す。 (例)<!--開始-->ここに書き出す。<!--終了--> このどちらかが出来ればいいのですが、上記スクリプトをどのように変更すれば可能になるでしょうか?お手数ですが、どうぞ宜しくお願いいたします。

    • ベストアンサー
    • Perl
  • リナックスで攻撃?されているログ

    勉強用に立ち上げたサーバーの/var/log/secureに下のようなメッセージがぶわ~っと出力されていたんですが、 これは攻撃を受けていると見てよいのでしょうか? 一つ一つポートをかえてきているようで、とはいってもたまたまヒットしてもパスワードまでは分からないと思うのですが、 何となく不気味です。。。 67427 Feb 4 23:47:22 username sshd[3466]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=217-168-44-137.static.cablecom.ch user=root 67428 Feb 4 23:47:25 username sshd[3466]: Failed password for root from 217.168.44.137 port 41281 ssh2 67429 Feb 4 23:47:25 username sshd[3467]: Received disconnect from 217.168.44.137: 11: Bye Bye 67430 Feb 4 23:47:27 username sshd[3468]: pam_unix(sshd:auth): authentication failure; logname= uid=0 euid=0 tty=ssh ruser= rhost=217-168-44-137.static.cablecom.ch user=root 67431 Feb 4 23:47:29 username sshd[3468]: Failed password for root from 217.168.44.137 port 41641 ssh2 67432 Feb 4 23:47:29 username sshd[3469]: Received disconnect from 217.168.44.137: 11: Bye Bye 知識のある方ご教授いただければと思います。

  • リクエストの待ち時間が期待通りになりません。

    リクエストの待ち時間が期待通りになりません。 5秒以内にリクエストが行われた場合は、ループとスリープで待たせて、ログに記録されているタイムから5秒以上経過した時点で、新たにログにタイムを記録させたいと思っています。 複数人で同時アクセスもありますので、ループ内で常に最新のファイルを読み込む必要がある?ので、 以下のように書いてみましたが、5秒以内にリクエストした場合、通常は1秒待てば処理が終わるはずなのですが、ループが途中で終わらずに20秒待たされ、$flag==0のまま終わります。 適当な知識しかなくて恥ずかしいですが、どこか間違えている場所があればご指摘くださると幸いです。 my $logfile = "request.dat"; my $time = time; my $i = 0; my $flag=0; while ($i < 20) { $i++; open(IN, "< $logfile"); my ($request_time) = <IN>; close (IN); if($time < $request_time+5) { sleep(1); } else { $flag=1; last; } } if($flag==0){&error;} else { open(OUT,">$logfile"); print OUT $time; close(OUT); }

    • ベストアンサー
    • Perl
  • ファイルの読み込みと出力

    ファイルの読み込みと出力 Perl初心者です。よろしくお願いします。 file.csvのようなファイルを読み込んで、 out.csvのように出力するプログラムを作成しているのですが 途中で変な改行が度々入っているためどうしてもうまくいきません。 (file.csvですが、実際は1500行以上あります。 また、最後に必ずendが入っています。 下記のcsvですがテキスト形式で表示した内容です。) 初歩的な質問で申し訳ありません。 調べる限り調べたのですが分かりませんでした。 どうかよろしくお願いします。 「file.csv」 "2010/1/1","C","こんにちは","田中","end", "2009/10/2","B","おはよう","斉藤","end", "2007/3/20","E","Good mor ning","佐藤","end", "1988/8/16","F","こんばんは","中 村","end", "1999/1/10","A","Hello","木村","end", "2005/9/17","D","おはようご ざいます","斎藤","end", 「out.csv」(このように出力したいです) C,こんにちは,田中,2010/1/1,end, B,おはよう,斉藤,2009/10/2,end, E,Good morning,佐藤,2007/3/20,end, F,こんばんは,中村,1988/8/16,end, A,Hello,木村,1999/1/10,end, D,おはようございます,斎藤,2005/9/17,end, 「今書いているプログラムです」 #!/usr/local/bin/perl use strict; use Fatal qw/ open /; my $csv_file = "file.csv"; my @csv = &readCsvFile($csv_file); open(OUT,">out.csv"); for(my $i=0; $i<=5; $i++){    print OUT $csv[$i][1],",";    print OUT $csv[$i][2],",";    print OUT $csv[$i][3],",";    print OUT $csv[$i][0],",";    print OUT $csv[$i][4],","; } close(OUT); sub readCsvFile {    open(DATA, $_[0]);    while(<DATA>) {      chomp;      push @csv, [ split(/",\"/) ];    }    close(DATA);    return @csv; }

    • ベストアンサー
    • Perl
  • ログデーターの並び替え

    ログデーターの並び替え 5月1日<>30<>http://com/<>mail@mail 5月5日<>12<>http://com/<>mail@mail 5月7日<>25<>http://com/<>mail@mail 5月10日<>50<>http://com/<>mail@mail 5月23日<>14<>http://com/<>mail@mail 上記のログデータは以下の形式で保存されています。 $date<>$no<>$url<>$mail このログの$noの部分で数値の小さい順、または大きい順に並び替えしたいのですが、 どのようにすればいいのでしょうか? open(IN, "< $logfile"); my $list = <IN>; while(<IN>){ my ($date,$no,$url,$mail) = split(/<>/); if(条件){処理} push(@data, "$_"); } close(IN); #ここで関数 sort を使って並び替えするのだと思うのですが、実際どのようにすればいいかわかりません。 open(OUT,">$logfile"); print OUT $list; print OUT @data; close(OUT); perlは簡単な改造程度しかできなくて、ここのみなさんのように専門的な知識を持っていないので、どうしてもこの並び替えがわからずに困り果てております。お手数ですが、よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 文字をabcd...と出力させることってできますか?

    javaをやってる大学生です。 int i; for(i=0;i<10;i++){ System.out.print(i); } とやったら023456789とでるようなかんじで、 abcdefghij...とアルファベット順に出力させるにはどうしたらいいでしょうか?よろしくおねがいします。

    • ベストアンサー
    • Java
  • ファイルを読み込んで改行だけの行を取り除きたい

    こんばんは。 ファイルを読み込んで、改行だけの行を省いて、上書きしたいのですが なぜかうまくいきません。 ループ内にある改行の判定をするIF文がいけないと思うのですが…。 教えていただけないでしょうか? また、シングルクォーテーションダブルっクォーテーションは同じ意味 なのですか?「""」と「''」 作ったプログラムは以下です。 open(OUT,">$ssifile"); #改行のみのデータは除く @newtbl = (); foreach $siline ( @slines) { if ($slines ne "\n") { push @newtbl, $siline; } } print OUT @newtbl; close(OUT); 宜しくお願いいたします。

    • ベストアンサー
    • CGI
  • ログファイルの記録数

    # ログ更新 unshift(@new,"$num<>$addr\n"); open(OUT,">$logfile") || &error("Write Error: $logfile"); print OUT @new; close(OUT); 上記ログの書込みに、最大保存数を設定したいのですが、どのようにすればいいのでしょうか。 $max = 3; とした場合、3行超えたら古いファイルを消したいと考えています。よろしくお願いいたします。

    • ベストアンサー
    • Perl
  • 【JAVA】数字をひし形に出力するプログラムについ

    JAVAについて質問です。 import java.util.Scanner; public class Test { public static void main(String[] args) { Scanner in = new Scanner(System.in); int n = in.nextInt(); int count = 1, space = 0; for (int i = 1; i < 2 * n; i++) { if (i <= n) { space++; } else { space--; } for (int spc = n - space; spc > 0; spc--) { System.out.print(" "); } for (int j = 0; j < count; j++) { System.out.print(i); } if (i < n) { count = count + 2; } else { count = count - 2; } System.out.println(); } in.close(); } } ↑のプログラムで標準入力に例えば8と入力すると、 _______1↵ ______222↵ _____33333↵ ____4444444↵ ___555555555↵ __66666666666↵ _7777777777777↵ 888888888888888↵ _9999999999999↵ __1010101010101010101010↵ ___111111111111111111↵ ____12121212121212↵ _____1313131313↵ ______141414↵ _______ 15↵ という風なひし形が出力されます。 「_」は実際には出力されません。 これを _______1↵ ______222↵ _____33333↵ ____4444444↵ ___555555555↵ __66666666666↵ _7777777777777↵ 888888888888888↵ _9999999999999↵ __00000000000↵ ___111111111↵ ____2222222↵ _____33333↵ ______444↵ _______5↵ という風にしたいです。 (上から10段目以降は1の位が出力されるようにしたいのです) それにはこのプログラムをどう修正すればよいでしょうか?

    • ベストアンサー
    • Java
  • 表示を一覧表形式にしたいのですが組みかたを教えてください。

    検索データを一覧表で表示したく、いろいろやってみたのですができません。なぜできないのか、どこがいけないのかおしえていただきたいのですが・・・ 一応、一覧表で表示されていたスクリプトをお手本にやっていたのですが、知識がなさすぎてわかりません。よろしくおねがいします。 sub search { &header; print "<table border=1 cellspacing=1><tr>\n"; print "<th>情報提供者<th>ユーザ名<th>業務<th>顧客管理元<th>責任者<th>コメント</tr>\n"; # キーワード前準備 $in{'word'} =~ s/ / /g; @word = split(/\s+/, $in{'word'}); open(IN,"$logfile") || &error("Open Error : $logfile"); $i=0; while (<IN>) { ($no,$sub,$com,$p1,$p2,$p3,$p4) = split(/<>/); if ($in{'P1'} ne "99" && $in{'P1'} ne "$p1") { next; } if ($in{'P2'} ne "99" && $in{'P2'} ne "$p2") { next; } if ($in{'P3'} ne "99" && $in{'P3'} ne "$p3") { next; } if ($in{'P4'} ne "99" && $in{'P3'} ne "$p4") { next; } # キーワードマッチ $flag=1; foreach $key (@word) { if (index($_,$key) >= 0) { $flag=1; } else { $flag=0; last; } } if (!$flag) { next; } $i++; print "<td><b><a href=\"$script?mode=view&no=$no\">$sub</a></b></td>"; print "<td>$part1[$p1]</td><td>$part2[$p2]</td><td>$part3[$p3]</td><td>$part4[$p4]</td>"; print "<td><small>$com</small></td></tr>\n"; print "</table><P>\n"; } close(IN);

    • ベストアンサー
    • Perl

専門家に質問してみよう