brennerlein
Goto Top

BASH: Logfile nach enthaltenem Datum auswerten?

Hallo an alle,

Ich habe ein Logfile welches ca. alle 5 Minuten mit einer neuen Zeile befüllt wird. Das Log sieht so aus (Auschnitt):

2013-08-23_14:07:31 CUL_EM_6 CNT: 36 CUM: 1835.982 5MIN: 0.280 TOP: 0.480
2013-08-23_14:17:31 CUL_EM_6 CNT: 38 CUM: 1836.046 5MIN: 0.380 TOP: 0.470
2013-08-23_14:22:31 CUL_EM_6 CNT: 39 CUM: 1836.080 5MIN: 0.410 TOP: 0.480
2013-08-23_14:22:31 CUL_EM_6 CNT: 39 CUM: 1836.080 5MIN: 0.410 TOP: 0.480
2013-08-23_14:32:31 CUL_EM_6 CNT: 41 CUM: 1836.152 5MIN: 0.450 TOP: 0.610
2013-08-23_14:37:31 CUL_EM_6 CNT: 42 CUM: 1836.200 5MIN: 0.580 TOP: 0.660
2013-08-23_14:42:31 CUL_EM_6 CNT: 43 CUM: 1836.241 5MIN: 0.490 TOP: 0.610
2013-08-23_14:47:31 CUL_EM_6 CNT: 44 CUM: 1836.284 5MIN: 0.510 TOP: 0.570
2013-08-23_14:52:31 CUL_EM_6 CNT: 45 CUM: 1836.315 5MIN: 0.370 TOP: 0.560
2013-08-23_14:57:31 CUL_EM_6 CNT: 46 CUM: 1836.363 5MIN: 0.570 TOP: 0.680
2013-08-23_15:02:31 CUL_EM_6 CNT: 47 CUM: 1836.389 5MIN: 0.320 TOP: 0.660
2013-08-23_15:07:31 CUL_EM_6 CNT: 48 CUM: 1836.413 5MIN: 0.290 TOP: 0.450
2013-08-23_15:12:31 CUL_EM_6 CNT: 49 CUM: 1836.465 5MIN: 0.620 TOP: 0.710
2013-08-23_15:17:31 CUL_EM_6 CNT: 50 CUM: 1836.518 5MIN: 0.640 TOP: 0.700

Relevant ist für mich der CUM Wert. Das ist ein Zählerstand der sich ständig erhöht.
Ich möchte nun gerne den Verbrauch der letzten Stunde, des letzten Tages, Monat und Jahr ermitteln.

Zur Zeit behelfe ich mir damit (z.B. für den Stundenwert) einfach den aktuellsten CUM Wert auszucutten und die zwölfte Zeile davor (1h=60Min; 60Min/5Min=12) ebenfalls den CUM Wert rauszucutten und aus diesen dann die Differenz zu ermitteln.

Ihr werdet jetzt wahrscheinlich die Hände über den Kopf zusammenschlagen, aber ich weiß mir nicht anders zu helfen.
Das eigentliche Problem bei meiner Methode sind fehlende Datenpakete. Wenn der Empfänger ein Paket nicht mitbekommt, wird auch nicht im Log geschrieben. Das kommt häufig vor. Mit meiner Methode kommen dann natürlich zu große Differenzen zu stande weil ich ja dann, wie im Beispiel, nicht die Differenz von 1h habe sondern eben auch mal von 1h15min. Bei den Tages/Monats/Jahresberechnung ist der Wert dann schon enorm falsch.

Aus diesem Grund würde ich gerne den Timestamp nutzen, habe aber keine Ahnung wie ich das mit einem Bashscript hinbekomme.

Content-Key: 215563

Url: https://administrator.de/contentid/215563

Printed on: April 19, 2024 at 22:04 o'clock

Mitglied: 106543
106543 Aug 29, 2013 at 12:06:09 (UTC)
Goto Top
Hi,

Batch hat keine Funktionen zur Datumsbrechnung, ich kann dir von daher nur VBS empfehlen.
Davon hab ich zwar selbst keine Ahnung, aber @colinardo könnte hier helfen face-wink

Grüße
Exze
Member: Brennerlein
Brennerlein Aug 29, 2013 at 12:11:46 (UTC)
Goto Top
Zitat von @106543:
Hi,

Batch hat keine Funktionen zur Datumsbrechnung, ich kann dir von daher nur VBS empfehlen.


Batch? Wie kommste da drauf? Ich brauche es in der Linux Bash/Shell
Mitglied: 106543
106543 Aug 29, 2013 at 12:12:41 (UTC)
Goto Top
Hi,

ah sorry verlesen :D
da kann ich dir leider trotzdem nicht weiterhelfen face-confused

Grüße
Exze
Member: Snowman25
Snowman25 Aug 29, 2013 updated at 12:16:09 (UTC)
Goto Top
Hallo @Brennerlein,

So wie dein Beispiel-File aussieht, gibt es ja wohl keinen "Lag" in dem System (wodurchein Timestamp 15:05:59 und der nächste 15:11:00 wäre). Deshalb solltest du mit grep und awk glücklich werden können.
Ich bin über folgendes gestolpert: Zeitdifferenz in bash berechnen ~ StackOverflow

Hier mal ein Beispielskript, welches ich geschrieben habe, um die Quotas auf unserem Mailserver zu berechnen:
#!/bin/csh
set HEADS=quotaheads.num
set BOTTOMS=quotabottoms.num

if ( `id -u` != 0) then
        echo "This script must be run as root!"  
else
        cd /var/imap/quota
        foreach i ( */* )
                head -n 1 $i>>$HEADS
                tail -n 1 $i>>$BOTTOMS
        end

        echo "Total used:"  
                awk 'BEGIN{a=0}{a+=$1}END{a/=1073741824;print a " GB"}' $HEADS  
        echo "Total allocated:"  
                awk 'BEGIN{a=0}{a+=$1}END{a/=1048576;print a " GB"}' $BOTTOMS  
        rm $HEADS
        rm $BOTTOMS
endif
Hoffentlich hilft das, dir AWK besser verständlich zu machen. Es ist relativ kompliziert, sich in AWK einzuarbeiten.
1073741824 und 1048576 sind bloß Umrechungsfaktoren und nicht von weiterer Bedeutung.

Gruß,
@Snowman25
Member: Brennerlein
Brennerlein Aug 29, 2013 at 12:34:13 (UTC)
Goto Top
Da hast du mir ja einige Ansätze aufgezeigt.

Ich bin gerade auf einen zusätzlichen Gedanken gekommen.

Könnte man nicht über einen cron Job jede Stunde, jeden Tag, jede Woche, jedes Jahr, ein Script anstoßen welches den CUM Wert in eine Datei schreibt. Dann hätte ich ja quasi zwei Werte die ich nur noch subtrahieren müsste und das Timing wird dem OS überlassen.

Könnte das funktionieren?
Mitglied: 108012
108012 Aug 29, 2013 at 12:54:38 (UTC)
Goto Top
Hallo,

Könnte das funktionieren?
Ja sicher wenn;
- Wenn Du anacron dafür nimmst ist es sogar ohne booten möglich!
- wenn alle beteiligten die selbe Uhrzeit haben
- wenn die Uhrzeit richtig ist

Aber man kann ja auch zwei ShellScripte laufen lassen!

Eines das immer nachschaut welches Datum und welche Uhrzeit gerade ist und dann gegebenenfalls das andere Script startet
und Dir zum Schluss eine Mail an den den Systemverwalter namens root oder an Dein echtes Postfach schickt!

Gruß
Dobby
Member: Brennerlein
Brennerlein Aug 29, 2013 at 14:23:35 (UTC)
Goto Top
Danke für die bisherigen Tipps,

ich werd mal schauen was ich daraus machen kann!