• ベストアンサー

指定した日時以降に吐かれたアラートログの行を見つける方法

オラクルのアラートログに、ユーザーが指定した日時以降で「ORA-」が出力されていれば、 「エラーが発生しています」 と標準出力で表示するシェルスクリプト(Bシェル)を作成しようとしています(理由は初心者でも簡単にエラー発生有無を確認できるようにするため)。 (例) %sh alertlog_err_check.sh 20060710 1500 と実行した場合、 アラートログの2006年7月10日15時~現在までの間で1つでも「ORA-」が吐かれていれば、「エラーが発生しています」と出力。 ユーザーが指定した日時以降に吐かれたアラートログの行を見つけ、そこから最終行までの間でgrepコマンドにより「ORA-」を検索する方法を考えているのですが、ユーザーが指定した日時以降に吐かれたアラートログの行を見つけるロジックが思いつきません。 何か良い方法があればアドバイスをお願いします。 [環境] OS:Solaris9 DB:Oracle9i

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

  • ベストアンサー
  • guci-ok
  • ベストアンサー率33% (49/146)
回答No.2

私はSolaris9/Oracle8しか使ったことないのですが、私の環境では、これで いけます。 私の理解では、日付の行のあとにメッセージがくる。 ただし、このスクリプトの動作確認は、アラートログをダウンロードして Windowsで行いました。(プラットフォーム非依存だ) しかし、アラートログを常に監視していて、メッセージが出力されたらメール などで通知する仕組みのほうが実用的ではないですか? うちでは、そうしています。 #!Perl # usage: ORAALART.pl yyyymmdd /path/to/alart.log # $Id: ORAALART.pl,v 1.0 2006-08-02 10:30 guci-ok Exp $ my $in_date = shift; # like "200608020911" die "Error date format '2yyymmddHHMM'" unless $in_date =~ /^2\d{3}\d{2}\d{2}\d{2}\d{2}$/; my %MONTH = qw(Jan 01 Feb 02 Mar 03 Apr 04 May 05 Jun 06 Jul 07 Aug 08 Sep 09 Oct 10 Nov 11 Dec 12); # search date my $date_found = 0; while (<>) { if (/^\w{3}\s+(Jan|Feb|Mar|Apr|May|Jun|Jul|Aug|Sep|Oct|Nov|Dec)\s+(\d{1,2})\s+(\d\d):(\d\d):\d\d\s+(\d{4})/) { my ($mm, $dd, $HH, $MM, $yyyy) = ($1, $2, $3, $4, $5); $mm = $MONTH{$mm}; $dd = sprintf '%02d', $dd; my $date = $yyyy . $mm . $dd . $HH . $MM; print STDERR "... check date: $date ...\n"; if ($date ge $in_date) { print STDERR "... date found older than: $in_date ...\n"; ++$date_found; last; } } } unless ($date_found) { print "ORA- record not found\n"; exit; } # search ORA- my $ora_found = 0; while (<>) { if (/^ORA\-/) { print "ORA- record found!\n"; ++$ora_found; last; } } print "ORA- record not found\n" unless $ora_found; __END__

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

その他の回答 (1)

  • corgi12kg
  • ベストアンサー率51% (28/54)
回答No.1

アラートログの書式はちょっといいかげんなので そのままでは実現困難とおもいます。 Solarisならばlogadmというコマンドがあるので 毎日アラートを別の(日付+ファイル名など)ファイルにきりだせば いいのでは?

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

関連するQ&A

  • 【シェル】whileコマンドについて

    【シェル】whileコマンドについて OS:Solaris10 SH:Bシェル お世話になります。 whileコマンドにてテキストから、先頭に"#"(シャープ)が付いている行と、 空白行以外を読み込ませたいです。 ところが、メイン処理にawkコマンドを入れると、テキストを読む時点で、 行全体ではなく、指定したフィールド内の文字列を読みにいくため、 "#"(シャープ)が付いている行を無視することができません。 ====== while.sh ====== #!/bin/sh while read LINE do echo $LINE | awk '{print $2}' done < list.txt | grep -v "^#" | grep -v "^$" ====================== ------ list.txt ------ 1 2 3 #4 5 6 7 8 9 ---------------------- ****** 出力結果 ****** 2 5 8 ********************** ** 出力させたい結果 ** 2 8 ********************** whileコマンドのオプション等で、テキスト内に特定の記号がある行は 無視して読み込ませる方法がありましたら、ご教授ください。 宜しくお願い致します。

  • コマンドの出力結果をn行おきに出力する方法

    コマンドの出力結果をn行おきに出力する、出来るだけシンプルな方法を知りたいです。 例えば、あるファイルの中身をgrepで絞込み、かつそれを5行ごとに出力させる等。 シェルの種類は問いません。 宜しくお願い致します。

  • 指定日時以降に更新(作成)されたファイルの抽出

    指定日時以降に更新・作成されたファイルの一覧を抽出し、テキストやCSV出力できるような方法を探しています。 フリーソフト、あるいはコマンドプロンプトなどで実現可能な方法はありますでしょうか?

  • シェルスクリプトでユーザ指定

    メールサーバにメールが届くと、固定の指定ユーザでPHPのファイルを実行するというシステムを作っていて質問があります。 Sendmailのaliasesでmlexe.shというシェルスクリプを起動して、シェルスクリプト内で指定したユーザu02でmls.phpを起動させようとして以下のスクリプトを作りました。 #!/bin/sh su u02 -c "/usr/bin/php /usr/local/apache/phtml/msv/mls.php" exit 3行目のexitは必要なんでしょうか?念のために書いているんですが。 これで準備ができたので、aliasesに設定したアドレスにメールを出しました。 すると、エラーが発生したというメールが返ってきました。その内容には ----- Transcript of session follows ----- Password: Sorry と書かれていたので、シェルスクリプトを実行したroot?がu02のパスワードが分からなかったのが原因だと思うのですがそうなんでしょうか? シェルスクリプトにu02のパスワードが必要なんですか?

  • Solarisでのgrepについて

    Solarisのgrepには、前後の行を表示するオプションがないと 思います。 GNUのgrepを使用できない(構成を変更できない)環境ですが、 Linuxのgrepでいう[-A]や[-B]オプションを使用したシェルが 必要になり困っています。 できれば、下記のgrepのように|(パイプ)で挟んで使用している 状態にしたいのですが、コマンドやオプションを教えていただけ ませんか? ***|grep -B1 ***|*** シェルを早急に作成する必要がありますが、知識が乏しく 大変困っています。 よろしくお願いいたします。

  • ワードの2行目以降のインデントのみの設定方法について

    ワード2003で2行目以降だけのインデントを設定するショートカットキーを設定できないでしょうか? 1行目あるいは段落全体のインデントを動かすショートカットキーについては設定できます。 (ツール→ユーザー設定→(下の方にある)キーボード(K)→(コマンドの指定の中の)分類(C)で書式を選択→(右隣の選択欄の)コマンド(O)の中でIndentcharあるいはIndentFirstCharを設定) ところが2行目以降のみのインデントはどうも見あたらないのですが、設定は可能なのでしょうか?

  • apache停止してたら再起動させるcron

    apache停止してたら再起動させるcron アパッチ停止時してたら再起動させるcronを設定したいのですが、cronに以下を設定してもうまくいきません。 set http=`ps aux | grep -v grep | grep -c http` ; if ( $http < 2 ) /usr/local/sbin/restart_apache cronエラーとしてマスターユーザに以下エラーが来ます。 Syntax error: word unexpected (expecting "then") シェルがX-Cron-Env: <SHELL=/bin/sh>であるという記述もありcron実行時にはshを使う? ようなのですが。。。ググっても解決できずにいます! thenとendifを入れてもだめです。 おそらく1行で実行する構文?がよくないのだと思っています。 セミコロン;とかを入れてみてもうまくいきませんでした。 どなたかおわかりでしょうか

  • シェルスクリプト コマンドを変数にした時の呼び方

    はじめまして、シェルスクリプトを勉強中の者です。 コマンドを変数にいれて、まとめました。 しかしコマンドの変数を呼びこもうとするとエラーになります。 ============================================ #!/bin/sh GREP="grep" cat "${GREP} '^[0-9]' /home/hoge/test.nicdf" ============================================ ================ シェル実行結果 ============= $ ./test.sh cat: grep '^[0-9]' /home/hoge/test.nicdf: そのようなファイルやディレクトリはありません どう書けば、エラーにならずに正常に動作するでしょうか? ご教授の程よろしくお願いします。

  • ACCESS テーブルに2行目から取り込む方法

    Access2013で、 指定の場所に置いてあるCSVファイルに対して、 「リンクテーブルを作成してソースデータにリンクする」設定にてテーブルを作成し、 このCSVファイルが更新されても最新の状態にてレポートを出力できるようにしています。 しかしこのCSVデータが作成される仕様により、1行目に余計な文字列、2行目に項目名、3行目以降にデータが入っているため、毎回CSVデータの1行目を削除する手作業が発生しています。 2行目以降をリンクするようにするとか、テーブルの3行目以降を取り出すクエリとか方法はありませんでしょうか?

  • 質問します。

    質問します。 シェルスクリプトで 標準出力とエラー出力をテキストに「追記で」出力するには どうすればよいでしょうか? コマンドプロンプトでは「sh test.sh >>& aaa.txt」 でうまくいくのですが、 シェルスクリプトで同じコマンドを発行すると、 「syntax error near unexpected token `&'」が発生します。