An die Shellscript-Fans: wie Logdatei ab letzten Vorkommen eines Textes anzeigen

roedert

roedert

Aktives Mitglied
Thread Starter
Dabei seit
05.01.2011
Beiträge
12.148
Reaktionspunkte
3.315
Ich versuche irgendwie mit einem kleinen Shellscript diese Aufgaben zu lösen:

- Anzeige einer Logdatei ab dem letzten Vorkommen eine festen Textes bis zum Ende
Beispiel:Anzeige Log ab letztem "starte xyz"
blahblahblah
ende xyz
starte xyz
blahblahblah
ende xyz
starte xyz
blahblahblah
ende xyz


- Anzeige einer Logdatei ab einem Zeitpunkt bis zum Ende
Beispiel: Anzeige Log ab 2016-01-01 15:00
2016-01-01 11:00 blahblahblah
2016-01-01 11:03 blahblahblah
2016-01-01 12:00 blahblahblah
2016-01-01 16:00 blahblahblah
2016-01-01 17:00 blahblahblah


Es soll immer nur der rote Teil angezeigt werden.
Aber irgendwie bin ich da mit grep, tail und wie sie alle heissen am Ende ... ich find einfach nicht die "zündende Idee"

Ich vermute sed ist hier das richtige Tool ... allerdings ist dies doch teilweise sehr schwer zu verstehen (zumindest für mich)
 
ein schneller hack wäre grep -A für z.b. 1. beispiel mit festem text.
Code:
printf "11\n12\n13\n14\n15\n16\n17\n18\n19\n" | grep -A999999999 '15\|16'
annahme: logfiles sind nie größer 10^9 lines, fester text oder wahrscheinlich vorkommender text ('15\|16' uhr).

wenn nur das letzte vorkommen gezeigt werden soll, kannst du mit tac * (reverse cat) sozusagen von hinten her greppen und das erste ergebnis (-B999999999 -m1) wieder mit tac richtig herum ausgeben ** oder du müsstest mit sed und dessen hold space (h) arbeiten. erschwerend kommt aber hinzu, dass du evtl. noch einen stop marker hast, also mehrzeilige auswertung.

um die annahmen zu beseitigen und weil evtl. die komplexität nicht vorhersehbar ist (datum auswerten), würde ich eher zu awk als zu sed greifen (awk ist eher feld- denn zeilenbasiert).

gesammelte oneliner zum einstieg:
http://sed.sourceforge.net/sed1line.txt
http://www.pement.org/awk/awk1line.txt

* tac ohne tac: alias tac='tail -r'

**
Code:
printf "bla1\nende xyz\nstart xyz\nbla2\nende xyz\nstart xyz\nbla3\nende xyz\n"
printf "bla1\nende xyz\nstart xyz\nbla2\nende xyz\nstart xyz\nbla3\nende xyz\n" | tac | grep -B999999999 -m1 'start xyz' | tac
 
Zuletzt bearbeitet:
  • Gefällt mir
Reaktionen: HJOrtmann, roedert und Macschrauber
Über tac binich auch schon gestolpert, gibts unter OSX leider nicht - auch nicht als Port ... da war der Tipp mit dem tac = tail -r hilfreich!
Eine Lösung für Beispiel 1 wäre dann
tail -r <filename> | grep -m 1 -B999999999 "starte xyz" | tail -r

Da es bei Beispiel 2 ja nicht um 1:1 Suchen geht, sondern eher um einen Datumsvergleich mit größer, wird es wohl besser sein ein kleines php-Script o.ä. zu basteln
 
Da es bei Beispiel 2 ja nicht um 1:1 Suchen geht, sondern eher um einen Datumsvergleich mit größer, wird es wohl besser sein ein kleines php-Script o.ä. zu basteln
hast du schon was gebaut und warum ausgerechnet php?
 
nö, noch nicht .... php, perl .. eigentlich egal, irgendeine Scriptsprache die mit möglichst wenig Aufwand gut mit Datum umgehen kann

Wichtig war mir Beispiel 1 um das Log vom letzen TM- und arq-backup anzeigen und monitoren lassen zu können. Und das klappt mit dem tail -r bestens.
 
perl wäre ok, aber sowas in php, gnade... fleh...
ok, bin schon wieder ernst. :augen:

Code:
awk -F'[- :]' '$1>=2016 && $2>=01 && $3>=01 && $4>=15 && $5>=00 {print}'
letztendlich muss man in awk oder sed einfach anfangen, obige oneliner helfen für den einstieg recht gut. unter anderem, wenn man sich die simulationen anderer tools anschaut (uniq, head, tail, grep -v, usw.).
 
awk -F'[- :]' '$1>=2016 && $2>=01 && $3>=01 && $4>=15 && $5>=00 {print}'
Guter Ansatz ... aber leider nicht ganz so einfach.
Man muss das Datum schon richtig vergleichen .... die reine Und-Verknüpfung Stunde >= 15 und Minute >= 30 lässt auch die Einträge zwischen 16:00-16:30, 17:00-17:30 etc weg und auch alle der Folgetage vor 15:30
 
Zuletzt bearbeitet:
freilich ist das erst ein ansatz (steht ja oben "einfach anfangen"). ich soll doch wohl nicht alles alleine machen. :p

du siehst aber, das man die felder recht einfach aufteilen und damit weiterrechnen kann, z.b. könnte man aus dem datum timestamps machen und damit arbeiten.
 
bis erst der compiler warm läuft, script ich mir das halt schnell zusammen.
hab aber auch eine ziemliche sammlung und fühlte mich auch unterm alten macos regelrecht kastriert. :crack:

"Ein Leben ohne scripts ist möglich, aber sinnlos."
 
  • Gefällt mir
Reaktionen: Andi und roedert
"Ein Leben ohne scripts ist möglich, aber sinnlos."
Wesentliches auf eine Zeile konzentrieren.

Das Classic OS fand ich nicht so schlecht. Hosentaschensystem halt. Du als User bleibst jetzt gefälligst 5 Min da (Passworteingabe) dann läuft die Mühle wieder und ich schaukel 55 Min die Eier...

Da war ich noch jung und habe den Bastard Operator From Hell bewundert.
 
  • Gefällt mir
Reaktionen: Olivetti
Hach... der Bastardoperator... da war ich noch im Fido-Net unterwegs. :)
 
Zurück
Oben Unten