2016-04-11 7 views
0

スクリプトによって生成されたログファイルを検索するスクリプトを変更し、文字列をgrepし、文字列が見つかるとmailxを探します。文字列のbash grepログファイル

以下のスクリプトから、すべてのログではなく行が返されるログのみを送信したいとします。毎日35以上のデータベースがログです。

擬似コード:

if grep TOTAL $REPORTS/${ORACLE_SID}_Tablespace.log 
then 
mail -s "$ORACLE_SID Tablespace Alert" `cat $ORAMAIL/dba_list` < \ 
$REPORTS/${ORACLE_SID}_Tablespace.log 
fi 

begin script: 

. /u01/app/oracle/oraconfig/Oracle.env.new.vars 

echo "$0 execution started "`date` 

for NAME in `cat $ORACONFIG/dbname.list` 
do 
ORACLE_SID=$NAME 
export ORACLE_SID 

sqlplus '/ as sysdba' <<EOF > $REPORTS/${ORACLE_SID}_Tablespace.log 2>&1 
@$TOOLS/chk_tablespace.sql 
EOF 

TODAY=`date +%Y-%m-%d` 

mail -s "$ORACLE_SID Tablespace Alert" `cat $ORAMAIL/dba_list` < \ 
$REPORTS/${ORACLE_SID}_Tablespace.log 


done 

echo "$0 execution completed "`date` 
+0

あなたはSOの新しいようです。回答をテストしたら、答えが問題を解決したと思われる場合は、緑色のチェックマークをクリックして「受け入れ済み」とマークしてください。これはまだ回答のない古いSOの質問に焦点を当てるのに役立ちます。 –

答えて

0

私は簡単にこれをテストすることはできませんが、私はそれはあなたが求めているものを行いだと思います。 ifステートメントを使うことができますが、&&とbashの短絡機能がここでうまくいきます。 grepから戻りコードを実行し、grepが成功した場合にのみ&&の後のステートメントを実行します。あなたの1行のHEREファイルをechoステートメントに変更し、ログファイルの変数でコードをDRYしました。

. /u01/app/oracle/oraconfig/Oracle.env.new.vars 

echo "$0 execution started "`date` 

for NAME in `cat $ORACONFIG/dbname.list` 
do 
    export ORACLE_SID=$NAME 
    logfile=$REPORTS/${ORACLE_SID}_Tablespace.log 

    echo "@$TOOLS/chk_tablespace.sql" | 
    sqlplus '/ as sysdba' > $logfile 2>&1 

    TODAY=`date +%Y-%m-%d` 

    grep TOTAL $logfile && 
    mail -s "$ORACLE_SID Tablespace Alert" `cat $ORAMAIL/dba_list` < $logfile 
done 

echo "$0 execution completed "`date` 
+0

'$(コマンド)'や '\'コマンド\ ''や '$ var'で' for x 'を実行しないでください。 for-inは、(出力)文字列ではなく引数を反復するために使用されます。代わりに、glob(例えば '.txt')、配列(例えば$ {names [@]}' ')、while-read ループ(例えば、' -r行を読みながら ')を使用してください。 [Bash Pitfalls 1](http://mywiki.wooledge.org/BashPitfalls#pf1)と[行を読まない](http://mywiki.wooledge.org/DontReadLinesWithFor)を参照してください。 –

+0

あなたは良い点を作っていますが、これは決して強い言葉ではありません。 dbname.listにスペースやメタ文字を含む名前が含まれていないと仮定することは妥当と思われます。また、存在していてもいなくても問題を回避するようにコードを試してはいけません。 –

+0

私はあなたが答えを書くのを好む方法を尊重します。一般的には、良い例や具体的な問題を解決するためのベストプラクティスを組み込むことをお勧めします。その結果、「ちょうどOK」のソリューションが動作する特定の問題を攻撃するのではなく、概念*を理解する方法を学ぶことができます。ちょっと: 'for $(cat file_name)'の行を変換するのはかなり簡単です。ちょうど 'read -r行中です。 do ...; done

関連する問題