2016-08-30 3 views
1

Ich habe eine Anwendung mit einem eigenen Protokolldateiformat. Jetzt möchte ich alle Zeilen von Protokollen mit bestimmten String-Werten wie "Schwerwiegender Fehler" innerhalb einer bestimmten Zeit erhalten. Das Log-Datenformat ist wie folgt aus:Wie bekomme ich alle Protokolle mit bestimmten Zeichenfolge Wert in den letzten ein paar Minuten

Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: abcd efddf 
Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd 
Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error 
Thread-28689296: Thu Aug 25 15:19:41 2016 [ info ]: dfdfdfd 

Wenn „jetzt“ 25. August 2016 15.19.41, ich 15.19.41 bis 15.17.41 diese Zeilen finden möchte, haben "Fataler Fehler" in meiner Protokolldatei. Daher sollte die aktuelle Zeit von Datum und vor x Minuten von "Datum x Minuten vor" sein, um bestimmte Fehlermeldungen aus dem Anwendungsprotokoll zu finden.

Wenn ich die folgende Befehlszeile:

awk -v Date="$(date "+%b %d %H:%M:%S %Y")" -v Date2="$(date -- date="2 
    minutes ago" "+%b %d %H:%M:%S %Y")" '$5 > Date && $5 < Date2' log_file | 
    grep "Fatal error" 

die Variable „$ 5“ in den Zustand tatsächlich den Wert der Minute „17“ und „19“ in meinem Beispiel Log-Daten bekommt, aber es vergleicht mit einem Datumswert Das wird also nicht funktionieren.

Wie kann ich den Wert der Zeit im Protokoll Zeitstempel von $ 3 bis $ 7 Felder zu vergleichen, um den Wert der aktuellen Zeit zu vergleichen. Ich bin mit Shell-Skripten nicht so vertraut.

Vielen Dank für Ihre Beratung und Hilfe im Voraus.

+0

Ich würde vorschlagen, die '$ 3' auf' $ 7' Felder in ein anderes Format, ein fester Länge konvertieren Eins, leichter zu vergleichen oder zu sortieren. Mein bevorzugtes ist ** 'YYYY-MM-TT HH: mm: SS' ** (oder **'% F% T' **) – Jdamian

+0

Nein, mein Problem ist, dass ich Wert aus Datenfeld von $ 3 bis $ 7 konstruieren muss um mit der aktuellen Zeit zu vergleichen. Ich weiß nicht, ob der konstruierte Wert in der Vergleichsbedingung verwendet werden kann oder soll ich eine andere Shell-Funktion schreiben, um das zu handhaben? –

Antwort

0

Sie dieses versuchen:

#!/bin/sh 

    Date="$(date "+%b %d %H:%M:%S %Y")" 
    Date2="$(date --date="2 minutes ago" "+%b %d %H:%M:%S %Y")" 

    first_line=$(grep -n "$Date2" log_file | awk -F ":" '{print $1}') 

    last_line=$(grep -n "$Date" log_file | awk -F ":" '{print $1}') 

    sed -n "${first_line},${last_line}p" log_file | grep "Fatal error" 
+0

Ich habe dein Skript ausgeführt, ich habe diesen Fehler "sed: -e Ausdruck # 1, Zeichen 1: unbekannter Befehl:', '". Ich habe die Syntax für reguläre Ausdrücke unter [link] (https://www.gnu.org/software/sed/manual/html_node/Regular-Expressions.html) überprüft. Es sagt "\ {i, j \} Entspricht zwischen i und j, einschließlich, Sequenzen." Also sollte Komma in Ihrem Fall in Ordnung sein. Ich bin auch nicht mit sed und regulärem Ausdruck vertraut. Haben Sie eine Ahnung von dem Fehler bei der Ausführung Ihres Skripts? Danke vielmals! –

+0

Sie haben den Fehler erhalten, weil die $ first_line & $ last_line leer sind. Sie haben keine Werte von den Befehlen in den Zeilen 4-5 des Skripts erhalten. –

+0

Sie sagten: "Ich möchte zwischen 15:19:41 und 15:17:41 finden" -> Müssen Sie wirklich in Sekunden zu vergleichen? oder nur 15:19 und 15:17 –

0

One in Gnu AWK:

$ cat > check.awk 
BEGIN { 
    start=mktime("2016 8 25 15 19 00") # desired start time. If now, use something like: 
    # end=strftime("%s"); start=end-120 
    end=mktime("2016 8 25 15 19 12") # end time for this example 
    # make text months into numbers: 
    split("Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",mons,",") 
    for(i in mons) 
     mons[mons[i]]=i 
} 
{ 
    atime=mktime($6" "mons[$3]" "$4" "gensub(/:/," ","g",$5)) # your log time format 
} 
atime<end && atime>start # && add your desired error messages here 
$ awk -f check.awk yer.log 
Thread-28689296: Thu Aug 25 15:19:01 2016 [ info ]: xvbdfdre dfdfd 
Thread-28689296: Thu Aug 25 15:19:11 2016 [ info ]: Fatal error 
Verwandte Themen