Mehrere Strings aus mehreren Dateien ausgeben

Mehrere Strings aus mehreren Dateien ausgeben

Hallo, mein aktueller Code ist:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*"\
 -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +  | xargs -l  basename

if [ $? -eq 0 ]; then
    tday="$(date +'%d.%m.%Y')"
    echo "ERROR found on $tday in the files obove!"

else
    tday="$(date +'%d.%m.%Y')"
    echo "No ERROR was found at the $tday !"
fi

Der Code gibt derzeit die Logdateien aus, die an diesem Tag erstellt oder bearbeitet wurden (nicht die der letzten 24 Stunden) und sucht, ob die Logdateien „ERROR“ enthalten und sagt einfach, in welchen Logdateien ein Fehler ist, oder wenn kein Fehler vorliegt, sagt er das auch.

Ich habe die Namen ein wenig zensiert, also denken Sie nicht, dass ich es vermasselt habe und es deshalb nicht funktioniert ;-)

Ausgabe (Beispiel):

gBatch_2070.log
gBatch_2071.log
ERROR found on 25.06.2014 in the files obove!

Der Ordner sieht folgendermaßen aus:

Ordner

Jede Datei sieht folgendermaßen aus:

Datei

Meine gewünschte Ausgabe:

Name der Datei + "ERROR" + die Meldung nach dem Fehler

Beispiel:

gBatch_2067.log – FEHLER **.batch.BatchStart = Batchverarbeitung beendet, gBatch_2077.log – FEHLER **.batch.BatchStart = Batchverarbeitung beendet, ...

Vielen Dank im Voraus für Ihre Hilfe!

Antwort1

Das sollte sein, wonach Sie suchen:

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*" -daystart -mtime -1 \
-exec grep -H "ERROR" {} \; | sed -e 's/.*\/gBatch_/gBatch_/g' -e 's/:[^E]*/: /g' | tr '\n' ', '

Beispielausgabe:

gBatch_2070.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
gBatch_2070.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
gBatch_2071.log:ERROR **.batch.BatchStart = Batchverarbeitung beeendet, gBatch_2077.log - ERROR **.batch.BatchStart = Batchverarbeitung beeendet
...

Erläuterung:

  • -Hzwingt grep, auch den Dateinamen auszudrucken
  • sed 's/.*\/gBatch_/gBatch_/g'Machen Sie den Dateinamen zum Basisdateinamen

Antwort2

find /home/user/logfilesError/ -maxdepth 1 -type f -name "gBatch_*"\
 -daystart -mtime -1 -exec grep -rl "ERROR" "{}" +  | xargs -l  basename\
 > /tmp/files_found

if [ $? -eq 0 ]; then
    tday="$(date +'%d.%m.%Y')"

    while read line
    do
       error=`grep "ERROR" /home/user/logfilesError/$line`
       error=`echo $error | sed 's/^.*ERROR/ERROR/' | tr '\n' ', '`
       echo "$line - $error"
    done < /tmp/files_found

    echo "ERROR found on $tday in the files obove!"
    rm /tmp/files_found

else
    tday="$(date +'%d.%m.%Y')"
    echo "No ERROR was found at the $tday !"
fi

verwandte Informationen