Dies ist meine Beispiel-Logdatei, die ich gerne aus einer sehr großen Logdatei extrahiere
2017-05-30 23:11:34,629 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking auth agent [accountName=rene1 remoteAddress=STEDGE/172.16.8.3]
2017-05-30 23:11:14,638 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - SSH: Failed login attempt on [172.16.8.1]. Username: "rene1".
2017-05-30 23:10:54,663 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.KeyboardInteractiveAuthentication - SSH: Sent SSH_MSG_USERAUTH_INFO_REQUEST (Password Authentication):
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - User login attempt has been made from address /172.16.8.1:58222
2017-05-30 23:10:36,415 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Invoking config agent [accountName=rene1 remoteAddress=/172.16.8.1]
2017-05-30 23:10:36,446 INFO [SSHD-TRANSFER-1] com.tumbleweed.st.server.sshd.AuthenticationProviderImpl - Config agent success [accountName=rene1 remoteAddress=/172.16.8.1]
Ich würde gerne den gesamten Logblock extrahieren, 23:10:36
aber 23:11:34
das sed
funktioniert nicht. Ich habe es getestet grep
, awk
aber keine Hoffnung auf das erwartete Ergebnis. Es gibt mir nur das Protokoll, das aufgetreten ist, 23:10:36
und das ist nicht mein erwartetes Ergebnis. Dies ist mein Befehl
sed -n '/23:10:36/,/23:11:34/p' stlog.txt
Weiß jemand, wie das funktioniert? Es enthält nur die Zeit ohne Datum, da mein Programm nur die aktuelle Systemzeit abruft und das Protokoll nur auf der Basis der aktuellen Systemzeit abfragt.
Antwort1
Ich sehe hier zwei Probleme: 1) Das Protokoll scheint in umgekehrter Reihenfolge zu sein, 2) Sie haben mehrere Zeilen, die dem „Ende“-Muster entsprechen.
(Obwohl die letzte Zeile 23:10:36,446 enthält, was später ist als 23:10:36,415 in der vorletzten Zeile)
Bei der umgekehrten Reihenfolge erhalten Sie nur die übereinstimmenden Zeilen, 23:10:36
da sed
mit dem Drucken begonnen wird, wenn dies erkannt wird, und fortgefahren wird, bis das Zeichen angezeigt wird 23:11:34
, das jedoch nicht vorhanden ist.
Das Umkehren der Muster (wie unten) scheint eine Lösung zu sein, Sie erhalten jedoch trotzdem nur die erste Zeile, die mit dem Endmuster übereinstimmt, da der Druckvorgang stoppt, wenn dieses Muster zum ersten Mal angezeigt wird.
sed -n '/23:11:34/,/23:10:36/p' stlog.txt
Hier ist eine awk
Lösung, die dieses Problem umgehen sollte:
awk -vstart="23:11:34" -vend="23:10:36" \
'$0 ~ start {p=1} $0 ~ end {e=1} e && $0 !~ end {p=0} p' stlog.txt
Die Variable p
steuert den Druck und wird erst gelöscht, wenn das Muster „Ende“ angezeigt wird ( e
ist 1).Unddie aktuelle Zeile entspricht nicht mehr diesem Muster.