[erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?

Vom einfachen Programm zum fertigen Debian-Paket, Fragen rund um Programmiersprachen, Scripting und Lizenzierung.
Antworten
tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

[erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 16:10:18

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.
Zuletzt geändert von tomi89 am 18.05.2018 23:52:51, insgesamt 1-mal geändert.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tobo » 18.05.2018 16:30:47

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:

Code: Alles auswählen

$ date "+%R" --date '-30 minutes'
Bzw. allgemein:

Code: Alles auswählen

$ T="12:34"
$ date "+%R" --date "$T 30 minutes ago"

rendegast
Beiträge: 15041
Registriert: 27.02.2006 16:50:33
Lizenz eigener Beiträge: MIT Lizenz

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von rendegast » 18.05.2018 19:00:00

Läuft Dein System unter systemd/journald, gäbe es

Code: Alles auswählen

journalctl --since ...  --until ... ...
hier speziell

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")

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 20:54:18

Erstmal danke für die schnellen Antworten.

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
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.
Zuletzt geändert von tomi89 am 18.05.2018 21:17:06, insgesamt 1-mal geändert.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tobo » 18.05.2018 21:22:42

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

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 21:33:47

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?
Zuletzt geändert von tomi89 am 18.05.2018 21:47:48, insgesamt 1-mal geändert.

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 21:42:54

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.

inne
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?

Beitrag von inne » 18.05.2018 22:20:19

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?

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

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 22:27:56

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.

inne
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?

Beitrag von inne » 18.05.2018 22:42:16

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

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 22:46:30

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.
Zuletzt geändert von tomi89 am 18.05.2018 23:05:53, insgesamt 1-mal geändert.

inne
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?

Beitrag von inne » 18.05.2018 23:03:25

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.

tomi89
Beiträge: 269
Registriert: 21.08.2014 00:21:52

Re: Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tomi89 » 18.05.2018 23:09:55

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.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: [erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tobo » 19.05.2018 12:26:50

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.

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
EOE 15:49: Wieder zurückgesetzt auf die erste Version!

inne
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?

Beitrag von inne » 19.05.2018 16:06:51

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.

tobo
Beiträge: 2338
Registriert: 10.12.2008 10:51:41

Re: [erledigt] Wie rückliegenden Zeitstempel matchen per shell skripting?

Beitrag von tobo » 19.05.2018 17:40:27

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!?

Antworten