tail -XXX with grep doesn't work in while loop

Hi all,

I need some help. my shell script doesn't work especially in the loop.

#!/bin/sh -xv

export ORA_ADMIN=/oracle/home/admin
export ORACLE_SID=ORA_SID
cat ${ORA_ADMIN}/param_alert_log.ora | while read MSG
do
  #echo $MSG
  #echo "tail -400 ${ORA_ADMIN}/${ORACLE_SID}/bdump/alert_${ORACLE_SID}.log \| grep $MSG"
  tail -400 ${ORA_ADMIN}/${ORACLE_SID}/bdump/alert_${ORACLE_SID}.log | grep $MSG >> /tmp/ora600_${ORACLE_SID}.ora
  #echo "Retour val : $?"
done

check_stat=`cat /tmp/ora600_${ORACLE_SID}.ora|wc -l`;
oracle_num=`expr $check_stat`
if [ $oracle_num -ne 0 ]
then
   newm=`diff /tmp/ora600_${ORACLE_SID}.ora /tmp/ora600_${ORACLE_SID}.old|wc -l`
   chgflg=`expr $newm`
   if [ $chgflg -ne 0 ]
   then
      cat /tmp/ora600_${ORACLE_SID}.ora | mailx -s "$ORACLE_SID : alerte(s) ORA- detectee(s)" admin@XXX.fr
      echo "envoi mail"
   fi
fi

cp /tmp/ora600_${ORACLE_SID}.ora /tmp/ora600_${ORACLE_SID}.old
rm -f /tmp/ora600_${ORACLE_SID}.ora

Many thanks for help

Best regards

put a $ sign before the ORA_SID

export ORACLE_SID=ORA_SID

should be

export ORACLE_SID=$ORA_SID

Hi Panyam,

All environment variables are OK when I execute the script in debug mode. ORA_SID is the instance name like PROD or DEV...I've put the ORA_SID in the script just for not putting the true name.

The problem is if I execute the loop while, grep couldn't find the error in log file. grep -i also doesn't work. But if I execute individually the command below :

tail -400 ${ORA_ADMIN}/${ORACLE_SID}/bdump/alert_${ORACLE_SID}.log | grep ORA-XXXXX >> /tmp/ora600_${ORACLE_SID}.ora

It works.

Best regards

Abdel

Can you try by echoing the "MSG" variable , i don't think it's getting proper value , hence the "grep" is failing.

Also make sure that there are no leading/trailing spaces in the "MSG" variable value.(This u can check by printing the length of the MSG field).

Hi Panyam,

Yes I've echoed MSG and return $? fro grep. Below, the result execution on debug mode :

#!/bin/sh -xv
#***********************************************************
# recherche alerte ORA-600 et autres erreurs ORA-
# la liste des ORA- est dans parm_alert_log.ora
#***********************************************************
export ORA_ADMIN=/oracle/home/admin
+ export ORA_ADMIN=/oracle/home/admin
+ ORA_ADMIN=/oracle/home/admin
export ORACLE_SID=GESDOS
+ export ORACLE_SID=GESDOS
+ ORACLE_SID=GESDOS
#for MSG in `cat ${ORA_ADMIN}/param_alert_log.ora`
cat ${ORA_ADMIN}/param_alert_log.ora | while read MSG
do
  echo $MSG
  echo "tail -400 ${ORA_ADMIN}/${ORACLE_SID}/bdump/alert_${ORACLE_SID}.log \| grep $MSG"
  tail -400 ${ORA_ADMIN}/${ORACLE_SID}/bdump/alert_${ORACLE_SID}.log | grep $MSG >> /tmp/ora600_${ORACLE_SID}.ora
  echo "Return val grep : $?"
done
+ cat /oracle/home/admin/param_alert_log.ora
+ read MSG
+ echo $'ORA-00600\r'
ORA-00600
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00600
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00600
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-00600\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-1631\r'
ORA-1631
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1631
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1631
+ grep $'ORA-1631\r'
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-1650\r'
ORA-1650
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1650
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1650
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-1650\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-1652\r'
ORA-1652
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1652
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1652
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-1652\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-1653\r'
ORA-1653
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1653
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1653
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-1653\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-00447\r'
ORA-00447
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00447
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00447
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-00447\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-00603\r'
ORA-00603
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00603
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-00603
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-00603\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-01092\r'
ORA-01092
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-01092
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-01092
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-01092\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-02050\r'
ORA-02050
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-02050
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-02050
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-02050\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-1535\r'
ORA-1535
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1535
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-1535
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-1535\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG
+ echo $'ORA-02236\r'
ORA-02236
' echo 'tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-02236
tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log \| grep ORA-02236
+ tail -400 /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
+ grep $'ORA-02236\r'
+ echo 'Return val grep : 1'
Return val grep : 1
+ read MSG

#*************************************************************
# si erreur, envoi email . . . .
#*************************************************************
check_stat=`cat /tmp/ora600_${ORACLE_SID}.ora|wc -l`;
cat /tmp/ora600_${ORACLE_SID}.ora|wc -l
++ cat /tmp/ora600_GESDOS.ora
++ wc -l
+ check_stat=0
oracle_num=`expr $check_stat`
expr $check_stat
++ expr 0
+ oracle_num=0
if [ $oracle_num -ne 0 ]
then
   newm=`diff /tmp/ora600_${ORACLE_SID}.ora /tmp/ora600_${ORACLE_SID}.old|wc -l`
   chgflg=`expr $newm`
   if [ $chgflg -ne 0 ]
   then
      #*************************************************************
      # si erreur , envoi mail
      #*************************************************************
      #cat /tmp/ora600_${ORACLE_SID}.ora | mailx -s "$ORACLE_SID : alerte(s) ORA- detectee(s)" admin@site.fr
      echo "envoi mail"
   fi
fi
+ '[' 0 -ne 0 ']'

cp /tmp/ora600_${ORACLE_SID}.ora /tmp/ora600_${ORACLE_SID}.old
+ cp /tmp/ora600_GESDOS.ora /tmp/ora600_GESDOS.old
# rm -f /tmp/ora600_${ORACLE_SID}.ora

My alert log for debugging is :

cat /oracle/home/admin/GESDOS/bdump/alert_GESDOS.log
ORA-00600 : #### test error ####
ORA-1631 : #### test2 ####

Thanks

There's a carriage return at the end of $MSG, which I assume is not there when you run the command directly.

---------- Post updated at 11:31 AM ---------- Previous update was at 11:27 AM ----------

If the carriage returns only occur as part of CPM/DOS/Windows style line endings, you can just throw them away with:

tr -d \\r < ${ORA_ADMIN}/param_alert_log.ora | while read MSG

Also try putting quotes around the MSG variable:

grep "$MSG"

Further to alister, please post the output from this command which just makes all characters visible:

sed -n l /oracle/home/admin/param_alert_log.ora

Hi Alister,

Many thanks, It works now :b:. Effectively, carriage returns occur at line endings. I applied 'dos2unix' command to param file, why I have not thought of before:D.

Many many thanks for all.

Best regards,

Abdel