Stellen Sie den sed-Befehlsparameter für einen Zeitraum ein

Stellen Sie den sed-Befehlsparameter für einen Zeitraum ein

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:36aber 23:11:34das sedfunktioniert nicht. Ich habe es getestet grep, awkaber keine Hoffnung auf das erwartete Ergebnis. Es gibt mir nur das Protokoll, das aufgetreten ist, 23:10:36und 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:36da sedmit 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 awkLö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 psteuert den Druck und wird erst gelöscht, wenn das Muster „Ende“ angezeigt wird ( eist 1).Unddie aktuelle Zeile entspricht nicht mehr diesem Muster.

verwandte Informationen