bash grep日志文件为string然后mailx

时间:2016-04-11 20:17:15

标签: bash if-statement grep

我正在修改脚本以搜索脚本生成的日志文件,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`

1 个答案:

答案 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`