2016-04-11 5 views
0

Ich bin auf der Suche nach einem Skript, um die Protokolldateien durch das Skript, grep für eine Zeichenfolge, dann mailx, wenn die Zeichenfolge gefunden wird, zu suchen.bash grep Log-Datei für Zeichenfolge dann mailx

Aus dem folgenden Skript möchte ich nur die Protokolle senden, wo Zeilen zurückgegeben werden, anstatt alle Protokolle. Über 35 Datenbanken täglich ist ein Protokoll.

Pseudocode:

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

Sie scheinen SO neu zu sein. Nachdem Sie die Antworten getestet haben, wenn Sie der Meinung sind, dass eine Antwort das Problem gelöst hat, markieren Sie sie bitte als "akzeptiert", indem Sie auf das grüne Häkchen klicken. Dies hilft, den Fokus auf ältere SO-Fragen zu legen, die immer noch keine Antworten haben. –

Antwort

0

Ich kann dies leicht nicht testen, aber ich denke, es tut, was ihr bittet. Sie können die if Anweisung verwenden, aber die && und Kurzschlussfunktion von Bash dient hier gut; es spielt den Rückkehrcode von grep ab und führt die Aussage nach dem && nur aus, wenn der grep erfolgreich ist. Ich habe Ihre einzeilige HERE-Datei in eine Echo-Anweisung geändert und Ihren Code mit einer Variablen für die Protokolldatei DRYed.

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

Tun Sie das nie: 'für x in $ (Befehl)' oder '\' Befehl \ '' oder '$ var'. for-in wird für das Iterieren von Argumenten verwendet, nicht für (Ausgabe-) Zeichenfolgen. Verwenden Sie stattdessen einen Glob (z. B. '* .txt'), Arrays (z. B. $ {names [@]} ') oder eine while-read Schleife (z. B. while read -r line'). Siehe [Bash Pitfalls 1] (http://mywiki.wooledge.org/BashPitfalls#pf1) und [Lies keine Zeilen mit für] (http://mywiki.wooledge.org/DontReadLinesWithFor). –

+0

Sie machen einen guten Punkt, aber "nie" ist ein starkes Wort dafür. Ohne Informationen darüber, was in dieser Datei enthalten ist, scheint es vernünftig anzunehmen, dass dbname.list keine Namen mit Leerzeichen oder Metazeichen enthält und es das Beispiel klarer macht, nicht um ein Problem herum zu programmieren, das möglicherweise vorhanden ist oder nicht . –

+0

Ich respektiere die Art, wie du deine Antworten schreibst, solange ich über schlechte Praktiken, die ich für gefährlich halte, etwas sagen kann. Im Allgemeinen empfehle ich die Einbeziehung von Best Practices, wenn man ein gutes Beispiel oder eine Lösung für ein spezifisches Problem schreibt, so dass man lernen kann, ein Konzept * zu verstehen und nicht nur ein spezifisches Problem anzugreifen, für das eine "Nur OK" Lösung funktioniert. Nebenbei: Das Konvertieren einer 'for-Zeile in $ (cat file_name)' ist ziemlich einfach. Just 'while read -r Zeile; mach ...; fertig . Welches ist die korrekte und * sichere * Möglichkeit, eine Datei zeilenweise zu lesen. Siehe http://mywiki.wooledge.org/DontReadLinesWithFor –

Verwandte Themen