2016-04-07 6 views
0

Ich habe ein Systemprotokoll, das wie folgt aussieht:Wie kann ein Teil des System Log Tails durch einen anderen Text ersetzt werden?

[timestamp]: [eventA] the system has started. 
[timestamp]: [eventB] eventB detail is stored at <filepath> 

Die <filepath> aussehen wie "/var/usr/eventB_timestamp.txt"

ich auf das ganze Protokoll schauen normalerweise nicht, da es kontinuierlich erzeugt wird, so dass ich in der Regel „tail -F <logpath>“ um diese Ereignisse zu sehen. Die Hauptschwierigkeit ist, dass ich die <filepath> manuell öffnen muss, um zum Beispiel eventB zu sehen. Dies ist sehr ineffizient. Wie ersetze ich die Meldung Zeile:

[timestamp]: [eventB] eventB detail is stored at <filepath> 

mit

[timestamp]: [eventB] + content of <filepath> 

ich von etwas allein die Linie der grep dann sed/awk denke. Da ich beim Shell-Scripting sehr neu bin, gibt es einen zuverlässigen Weg, dies zu erreichen? Vielen Dank.

Antwort

0

die letzte Instanz entsprechender Datensätze Detail-Datei öffnen Sie den

tail ... | tac | awk '/eventB/{print $NF; exit}' | xargs cat 
tun können

den Ausgang umkehren, die ersten Muster, zu extrahieren Dateinamen finden und den Inhalt drucken.

0

/tmp/test/file.log:

[timestamp]: [eventA] the system has started. 
[timestamp]: [eventB] eventB detail is stored at /tmp/test/evenlog.file 
[timestamp]: [eventC] foo foo foo. 

/tmp/test/evenlog.file:

line 1 
line 2 
line 3 

Run-Befehl:

sed 's/\(.*[eventB\].*stored.at.\)\(.*\)/printf [*EventB*]:;cat \2 | xargs echo /e' /tmp/test/file.log 

Ausgabe:

[timestamp]: [eventA] the system has started. 
[*EventB*]:line 1 line 2 line 3 
[timestamp]: [eventC] foo foo foo. 

Grüße,

0

Ist das, was Sie suchen?

#!/bin/sh 

tail -F logfile | while read line; do 
    echo "$line" 
    case "$line" in 
    *"eventB detail is stored at"*) 
     filepath="${line##* }" 
     if [ -f "$filepath" ]; then 
     sed 's/^/ /' "$filepath" 
     else 
     echo "ERROR: file missing" 
     fi 
     ;; 
    esac 
done 

Dieser Schwanz Ihre Log, Lesen und jede Zeile gedruckt wird, und dann nach Zeilen, die mit einem Muster übereinstimmen, nimmt das letzte Wort auf der Linie als $filepath, und wenn eine Datei mit diesem Namen existiert, druckt ihn .. indended, für Ihr Lesevergnügen.


Sie könnten die gleiche Funktionalität in awk, mit weniger Tipp implementieren:

tail -F logfile | awk ' 
    1; 
    /eventB detail is stored at/ { 
     file=$NF 
     while (getline < file) { 
     printf("\t%s\n", $0); 
     } 
     close(file) 
    } 
' 

Beachten Sie, dass diese awk Lösung ziemlich spektakulär versagt, wenn die betreffende Datei nicht existiert. Wenn Sie also mit einer awk-Lösung arbeiten, könnte dies Ihr Ausgangspunkt sein, sollte aber nicht Ihre endgültige Lösung sein. YMMV. Nicht verantwortlich für den Gebrauch oder Missbrauch. Kann Nüsse enthalten.

Verwandte Themen