[erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?
[erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?
Guten!
leider ist mein fucking Affenhirn mal wieder zu dämlich.
Dabei wollte ich doch bloss einen vergangenen Zeitstempel in einer log Datei matchen, und zwar in einem Shellskript.
D.h. in der log Datei stehen bspw Zeilen wie:
14:53 pla pla blubber
Nun würde ich ja gerne die Zeile mit dem aktuellsten Zeitstempel ausgeben, WELCHER JEDOCH MINDESTENS 30 MINUTEN IN DER VERGANGENHEIT LIEGT (ausgehend von der aktuellen Systemzeit).
Wie man die aktuelle Systemzeit ausliest weis ich natürlich aber wie ich es auch drehe und wende schaffe ich es nicht den Zeitstempel korrekt zu matchen.
Ich bin halt kein Profi im shellskripten.
Kennt vielleicht jemand ein Beispiel oder einen passenden Link dazu?
Vielen dank im voraus.
leider ist mein fucking Affenhirn mal wieder zu dämlich.
Dabei wollte ich doch bloss einen vergangenen Zeitstempel in einer log Datei matchen, und zwar in einem Shellskript.
D.h. in der log Datei stehen bspw Zeilen wie:
14:53 pla pla blubber
Nun würde ich ja gerne die Zeile mit dem aktuellsten Zeitstempel ausgeben, WELCHER JEDOCH MINDESTENS 30 MINUTEN IN DER VERGANGENHEIT LIEGT (ausgehend von der aktuellen Systemzeit).
Wie man die aktuelle Systemzeit ausliest weis ich natürlich aber wie ich es auch drehe und wende schaffe ich es nicht den Zeitstempel korrekt zu matchen.
Ich bin halt kein Profi im shellskripten.
Kennt vielleicht jemand ein Beispiel oder einen passenden Link dazu?
Vielen dank im voraus.
Zuletzt geändert von tomi89 am 18.05.2018 23:52:51, insgesamt 1-mal geändert.
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Mir ist zwar nicht ganz klar was du hier mit matchen meinst und wo bzw. bei welchem Tool das Problem liegt, aber vielleicht suchst du das hier:
Bzw. allgemein:
Code: Alles auswählen
$ date "+%R" --date '-30 minutes'
Code: Alles auswählen
$ T="12:34"
$ date "+%R" --date "$T 30 minutes ago"
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Läuft Dein System unter systemd/journald, gäbe es
hier speziell
Code: Alles auswählen
journalctl --since ... --until ... ...
Code: Alles auswählen
journalctl --since -30m ...
mfg rendegast
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
-----------------------
Viel Eifer, viel Irrtum; weniger Eifer, weniger Irrtum; kein Eifer, kein Irrtum.
(Lin Yutang "Moment in Peking")
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Erstmal danke für die schnellen Antworten.
Ich meinte eine bestimmte Zeile aus einer Log Datei auszugeben.
Z.B. mit folgendem Inhalt:
Wenn es jetzt 14:15 wäre, dann wäre die aktuellste jedoch mindestens 30 Minuten zurückliegende Zeile die welche mit 13:00 beginnt.
Nur diese Zeile wollte ich dann gerne ausgeben.
Die Skriptingroutine sollte nur die eine korrekte Zeile aus meiner log Datei ausgeben.
Es handelt sich nicht um eine System relevante log Datei sondern eine individuell erstellte.
Es werden Informationen geloggt und ich möchte die letzte 30 Minuten zurückliegende Information auslesen.
Um die richtige Zeile zu matchen müsste ich allerdings eben den Zeitstempel richtig matchen.
D.h. die zeit müsste zurückberechnet werden und die nächstgelegene Zeile auszugeben.
Ich hoffe mal das das via Shellskript möglich ist.
Ich meinte eine bestimmte Zeile aus einer Log Datei auszugeben.
Z.B. mit folgendem Inhalt:
Code: Alles auswählen
12:00 aaaaaaa
13:00 bbbbbbbb
14: cccccccccc
Nur diese Zeile wollte ich dann gerne ausgeben.
Die Skriptingroutine sollte nur die eine korrekte Zeile aus meiner log Datei ausgeben.
Es handelt sich nicht um eine System relevante log Datei sondern eine individuell erstellte.
Es werden Informationen geloggt und ich möchte die letzte 30 Minuten zurückliegende Information auslesen.
Um die richtige Zeile zu matchen müsste ich allerdings eben den Zeitstempel richtig matchen.
D.h. die zeit müsste zurückberechnet werden und die nächstgelegene Zeile auszugeben.
Ich hoffe mal das das via Shellskript möglich ist.
Zuletzt geändert von tomi89 am 18.05.2018 21:17:06, insgesamt 1-mal geändert.
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Die relevante Information ist also, es soll die volle Stunde vor >=30 Minuten angezeigt werden:
Code: Alles auswählen
$ date "+%H:00" --date "30 minutes ago"
$ T1=14:15
$ T2=14:35
$ date "+%H:00" --date "$T1 30 minutes ago"
13:00
$ date "+%H:00" --date "$T2 30 minutes ago"
14:00
$ var=$(date "+%H:00" --date "30 minutes ago")
$ grep "$var" LOG.txt
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Filter erzeugen ist ein gutes Stichwort.
Ich muss mir erst mal dieses regexp angucken ob das vielleicht die Lösung darstellt. Aber ob sich das für eine Berechnung irgendwie gebrauchen lässt?
Ich muss mir erst mal dieses regexp angucken ob das vielleicht die Lösung darstellt. Aber ob sich das für eine Berechnung irgendwie gebrauchen lässt?
Zuletzt geändert von tomi89 am 18.05.2018 21:47:48, insgesamt 1-mal geändert.
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Nicht unbedingt eine volle Stunde. Das war nur ein Beispiel.
Aber eben den nächstgelegenen Zeitstempel, welcher mindestens eine halbe Stunde von der aktuellen Systemzeit zurückliegt.
Das ist ja mein Problem, den nächstgelegenen Zeitstempel ausfündig zu machen, weil die Zeitstempel eher zufällig sind.
Also die Berechnung Systemzeit minus eine halbe Stunde bekomme ich schon irgendwie hin, mit etwas googlen.
Nicht aber die Zeile mit dem passenden Zeitstempel zu finden.
Der variable Faktor ist genau mein grösstes Problem dabei.
Oder überhaupt das Nichtwissen welche Shell Fuktion zur Lösung des Problems nützlich sein könnte.
Aber eben den nächstgelegenen Zeitstempel, welcher mindestens eine halbe Stunde von der aktuellen Systemzeit zurückliegt.
Das ist ja mein Problem, den nächstgelegenen Zeitstempel ausfündig zu machen, weil die Zeitstempel eher zufällig sind.
Also die Berechnung Systemzeit minus eine halbe Stunde bekomme ich schon irgendwie hin, mit etwas googlen.
Nicht aber die Zeile mit dem passenden Zeitstempel zu finden.
Der variable Faktor ist genau mein grösstes Problem dabei.
Oder überhaupt das Nichtwissen welche Shell Fuktion zur Lösung des Problems nützlich sein könnte.
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Also den aktuellsten?
Alle der letzten halben Stunde?
Die welche genau eine halbe Stunde alt sind?
Die aktuellsten, die aber nicht älter als eine halbe Stunde sein sollen?
Alle der letzten halben Stunde?
Die welche genau eine halbe Stunde alt sind?
Die aktuellsten, die aber nicht älter als eine halbe Stunde sein sollen?
Code: Alles auswählen
# Das sollte den Log der letzten halben Stunde ausgeben
for i in $(seq 0 30 | tac); do
grep "$(date "+^%R " --date "$T $i minutes ago")" Pfad/zur/Logdatei
done
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Den aktuellsten der mindestens eine halbe Stunde zurückliegt.
So als würde man alle löschen welche innerhalb der letzten 30 Minuten liegen und danach den aktuellsten auslesen.
So als würde man alle löschen welche innerhalb der letzten 30 Minuten liegen und danach den aktuellsten auslesen.
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Ich glaube, das hier ist was du willst:
Code: Alles auswählen
nicht_anzeigen(){
for i in $(seq 0 30 | tac); do
grep "$(date "+^%R " --date "$T $i minutes ago")" Pfad/zur/Logdatei
done
}
head -n -$(nicht_anzeigen | wc -l) Pfad/zur/Logdatei
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Bezüglich des vorletzten Beispiels:
Zeigt um 23:03 22:56 an.
Bezüglich des letzten Beispiels:
Zeigt um 22:53 22:31 an, was weniger als 30 Minuten zurück liegt.
Ich glaube mit dem seq kann auch nicht zur letzen Stunde zurückrechnen falls es auf der Systemzeit z.B. erst viertel nach ist oder?
Also das z.B. um 22:05 21:35 angezeigt wird.
Genau daran bin ich auch immer gescheitert, erst ab dem Zeitpunkt wo es auf der Systemzeit 30 Minuten nach stand konnte ich korrekte Ergebnisse produzieren.
Zeigt um 23:03 22:56 an.
Bezüglich des letzten Beispiels:
Zeigt um 22:53 22:31 an, was weniger als 30 Minuten zurück liegt.
Ich glaube mit dem seq kann auch nicht zur letzen Stunde zurückrechnen falls es auf der Systemzeit z.B. erst viertel nach ist oder?
Also das z.B. um 22:05 21:35 angezeigt wird.
Genau daran bin ich auch immer gescheitert, erst ab dem Zeitpunkt wo es auf der Systemzeit 30 Minuten nach stand konnte ich korrekte Ergebnisse produzieren.
Zuletzt geändert von tomi89 am 18.05.2018 23:05:53, insgesamt 1-mal geändert.
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Das seq rechnet nicht mir der Zeit, das macht das date und das sollte auch korrekt sein. Das seq geht nur in Minutenschritten mittels date in der Zeit zurück.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: Wie rückliegenden Zeitstempel matchen per shell skripting?
Ach ja, jetzt hab ich es gerafft.
Aber dennoch kann seq über die Stundenschwelle z.B. um 22:05 als Ergebnis nicht 21:35 anzeigen.
Schade. So ging es mir die ganze zeit auch.
Aber durch date werde ich es morgen schon irgendwie lösen, vielleicht ja doch irgendwie mit dem regexp.
Endlich sehe ich Licht am ende des Tunnels.
Danke für eure Hilfe.
Aber dennoch kann seq über die Stundenschwelle z.B. um 22:05 als Ergebnis nicht 21:35 anzeigen.
Schade. So ging es mir die ganze zeit auch.
Aber durch date werde ich es morgen schon irgendwie lösen, vielleicht ja doch irgendwie mit dem regexp.
Endlich sehe ich Licht am ende des Tunnels.
Danke für eure Hilfe.
Re: [erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?
Es stellt sich die Frage, ob diese Datei geordnet ist oder nicht? Wenn man von unten die letzten x Zeilen wegnimmt, die <30 min liegen, ist dann die Zeile darüber (die erste >=30min) automatisch die gesuchte Zeile. Oder sind die Zeitstempel wild verteilt und es wird die Zeile mit dem Zeitstempel gesucht, der am nächsten an >=30min liegt?
EDIT, EDIT2 und ff.:
Für den naheliegenden ersten Fall vielleicht sowas (FN anpassen). Voraussetzung ist, dass die Zeilen mit hh:mm und einem folgenden Leerzeichen beginnen.
EOE 15:49: Wieder zurückgesetzt auf die erste Version!
EDIT, EDIT2 und ff.:
Für den naheliegenden ersten Fall vielleicht sowas (FN anpassen). Voraussetzung ist, dass die Zeilen mit hh:mm und einem folgenden Leerzeichen beginnen.
Code: Alles auswählen
#!/bin/bash
FN="${HOME:?}/LOG.txt" ## Hier eigene Logdatei angeben
RANGE=30
[ -f "$FN" ] || exit 1
now=$(date "+%R") ## Zeit jetzt (hh:mm)
now_minus_range=$(date "+%s" --date "$RANGE minutes ago") ## aktuelle Zeit-30 Min. (UNIX time)
while read -r line; do ## Datei rückwärts (wegen Zeit-/Datumssprung) durchgehen und zeilenweise einlesen
f1="${line%% *}" ## Nur das erste Feld aus Datei nehmen (getrennt durch Leerzeichen)
if [ "${f1:0:2}" -gt "${now:0:2}" ]; then ## Stunden in Datei > Stunden aktuelle Zeit
cmp=$(date "+%s" --date "yesterday $f1") ## Zeit ist von gestern ff.
else
if [ "${f1:0:2}" -eq "${now:0:2}" ] && [ "${f1:3:2}" -gt "${now:3:2}" ]; then ## Stunden =, Minuten >
cmp=$(date "+%s" --date "yesterday $f1") ## Zeit ist von gestern ff.
else
cmp=$(date "+%s" --date "today $f1") ## Zeit ist von heute
fi
fi
if [ "$cmp" -le "$now_minus_range" ]; then ## wenn (Zeit in Datei <= aktuelle Zeit-30) dann Treffer
printf "%s\n" "$line"
break
fi
done < <(tac "$FN")
exit 0
-
- Beiträge: 3289
- Registriert: 29.06.2013 17:32:10
- Lizenz eigener Beiträge: GNU General Public License
-
Kontaktdaten:
Re: [erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?
Den Zeit-/Datumssprung hatte ich gestern so nicht im Kopf – Dabei war es spät genug, um daran zu denken. Mir fehlte aber auch Gestern schon die Idee für einen Anwendungszweck.
Und ich würde da eher am Log was ändern. Also das volle Datum einfügen.
Und ich würde da eher am Log was ändern. Also das volle Datum einfügen.
(=_=)
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Unsere neue Mutter: https://www.nvidia.com/de-de/data-center/a100/
Re: [erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?
Das sehe ich absolut genauso. Zudem wäre es mit Datum erheblich einfacher umzusetzen und dazu auch noch fehlerunanfälliger. Die Variante oben z.B. würde nur in 47/48 Fällen funktionieren, wenn der Logger mal ein paar Tage Pause macht und während dieser Zeit abgefragt werden würde!?