2016-08-25 2 views
1

ich eine Textprotokolldatei haben, das Format wie die folgende istDatum: extra Operand% d‘Fehler

Thread-28689296: Thu Aug 25 15:18:41 2016 [ info ]: xxxxx xxxxxx xxxxx 

Deshalb möchte ich cron-Job zu finden, einige bestimmte Fehlermeldungen in den letzten ein paar Minuten laufen. Ich schrieb den folgenden Befehl

awk -vDate=`date +%b %d %H:%M:%S %Y` -vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y` '$5 > Date && $5 < Date2' /var/log/dummy.log | grep "Fatal" 

Im obigen Befehl i Suche nach Nachrichten, die einen Zeitstempel beween Zeit jetzt und vor 2 Minuten mit einem String Fatal.

Aber ich bekam die folgende Fehler

date: extra operand %d' 
Try date --help' for more information. 
date: extra operand %d' 
Try date --help' for more information. 

Wenn ich Datum Befehle ausführen, bekam ich die Ergebnisse wie folgt

date "+%b %d %H:%M:%S %Y" 
Aug 25 15:25:01 2016 

date --date="2 minutes ago" +"%b %d %H:%M:%S %Y" 
Aug 25 15:31:42 2016 

So sollten die Datumsbefehle in meinem awk-Skript in Ordnung sein.

Ich möchte auch die gefundenen Fehlermeldungen 2 Minuten in eine Datei umleiten, um als Alarm zu mailen, aber ich bin noch nicht so weit gekommen.

Bitte bitte mich beraten, was in meinem awk-Skript falsch ist. Vielen Dank im Voraus!

+0

Warum in aller Welt würden Sie dies mit Cron verkomplizieren? Hier ist eine Idee; Verwenden Sie Cron, um alle Protokolleinträge zu extrahieren, seit Sie Cron zuletzt ausgeführt haben, und fügen Sie diese Einträge dann in eine einzige Datei ein. Nennen Sie es die "Protokollkopie"! Im Ernst, wenn Sie innerhalb von zwei Minuten nach einem Protokolleintrag eine E-Mail-Benachrichtigung erhalten möchten, verwenden Sie nicht cron. Lassen Sie die Protokolle stattdessen durch einen Daemon (z. B. syslog-ng) leiten, der den Protokolleintrag erstellt und Ihnen eine E-Mail-Warnung sendet. –

+0

Die Protokolle sind nicht in Standard-Syslog, so dass ich nicht syslog-ng verwenden kann. –

Antwort

4

Das Problem hier ist mit date selbst. Mal sehen wie.

Sie sagen:

vDate2=`date --date="2 minutes ago" +%b %d %H:%M:%S %Y` 

Weil Sie

date --date="2 minutes ago" +%b %d %H:%M:%S %Y 

jedoch verwenden möchten, wenn Sie versuchen, es laufen Sie werden sehen, dass Sie den Fehler:

date: extra operand ‘%d’
Try 'date --help' for more information.

Das Problem besteht darin, dass Sie die FORMAT-Steuerelemente in doppelte Anführungszeichen einschließen müssen:

#        v     v 
$ date --date="2 minutes ago" "+%b %d %H:%M:%S %Y" 
Aug 25 14:49:31 2016 

Wenn dies geschehen ist, alle zusammen Ihre vollen awk Einzeiler können sein:

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' file 

Hinweis I -v Date="$(date ...)" bin mit:

+1

Rechts. Auch mit '-vDate = ...' ohne ein Leerzeichen hinter dem '-v' ist dein Skript gawk-spezifisch und da es gawk-spezifisch ist, brauchst du die externen Aufrufe von' date' gar nicht benutze gawks eingebaute Zeitfunktionen: 'awk 'BEGIN {fmt ="% b% d% H:% M:% S% Y "; Datum = strftime (fmt); Date2 = strftime (fmt, systime() - 120)} $ 5> Datum && $ 5

+1

Ups, habe deine Antwort nicht gesehen! –

+0

Ja, die Zeile -v Date = "$ (Datum" +% b% d% H:% M:% S% Y ")" löst den Fehler "Extra Operand" auf. Vielen Dank. Aber ich habe immer noch ein Problem mit meiner Bedingung "$ 5> Date && $ 5