2016-04-11 42 views
0

Bir betik değiştirmek için komut dosyası tarafından oluşturulan günlük dosyaları, bir dize için grep, sonra dize bulunursa mailx aramak için arıyorum.dize için bash grep günlük dosyası daha sonra mailx

Aşağıdaki komut dosyasından, yalnızca tüm günlükler yerine satırların döndüğü günlükleri göndermek istiyorum. Günlük 35+ veritabanı günlüktir.

sahte kod:

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 için yeni görünüyorsunuz. Cevapları test ettikten sonra, bir sorunun çözüldüğünü düşünüyorsanız, lütfen yeşil onay işaretini tıklayarak 'kabul edildi' olarak işaretleyin. Bu, hala cevapları olmayan eski SO sorularına odaklanmaya yardımcı olur. –

cevap

0

Kolayca bu test edemez, ama ne soran yapar düşünüyorum. if ifadesini kullanabilirsiniz, ancak && ve bash'ın kısa devre özelliği burada iyi hizmet vermektedir; dönüş kodunu grep'ten çalar ve yalnızca grep başarılı olursa &&'dan sonra ifadeyi çalıştırır. Tek satırlık HERE dosyanızı bir eko ifadesine dönüştürdüm ve kodunuzu log dosyası için bir değişken ile karıştırdım.

. /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

Bunu asla yapma: 'x için $ (command)' veya '\' command \ '' veya '$ var'. for-in, (çıkış) dizeleri değil argümanları yinelemek için kullanılır. Bunun yerine, bir glob (örn. '* .txt'), diziler (ör.' "$ {Names [@]}" ') veya bir süre okunan döngü kullanın (örn. Read -r line' iken). [Bash Tuzakları 1] (http://mywiki.wooledge.org/BashPitfalls#pf1) ve [Şununla ilgili satırları okuma] (http://mywiki.wooledge.org/DontReadLinesWithFor) konusuna bakın. –

+0

İyi bir nokta çiziyorsunuz, ama "asla" bunun için güçlü bir kelimedir. Bu dosyada ne olduğuyla ilgili herhangi bir bilgi olmadan, dbname.list'in boşluk veya meta-karakterler içeren isimler içermediğini ve örnekte bulunabilecek veya bulunmayabilecek bir sorunu kodlamaya çalışmamayı daha açık bir hale getirdiğini düşünmek mantıklı görünmektedir. . –

+0

Cevabınızı yazmayı tercih etme şeklinize saygı duyuyorum, kötü uygulamaları hakkında yorum yapabildiğim sürece tehlikeli buluyorum. Genel olarak, iyi bir örnek yazarken ya da belirli bir problem için bir çözüm oluştururken en iyi uygulamaların kullanılmasını öneririm. Böylece, bir kavramın * nasıl anlaşılacağını * öğrenebilir, sadece belirli bir soruna değil, “Just OK” çözümünün işe yaradığını öğrenebilirim. Yanında: '' $ (cat file_name) 'içindeki bir satır için' 'dönüştürme oldukça kolaydır. Sadece 'read -r line iken; yapmak ...;