我正在修改脚本以搜索脚本生成的日志文件,grep搜索字符串,然后调用mailx(如果找到字符串)。
从下面的脚本我想只发送返回行的日志而不是所有日志。每天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 :(得分:0)
我无法轻易测试,但我认为它符合您的要求。你可以使用if
语句,但bash的&&
和短路功能在这里很好用;它播放grep的返回代码,只有当grep成功时才执行&&
之后的语句。我将您的单行HERE文件更改为echo语句,并使用日志文件的变量来干掉代码。
. /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`