Este es mi archivo de registro de muestra que me gusta extraer de un archivo de registro muy grande.
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]
Me gustaría extraer todo el fragmento de registro 23:10:36
para 23:11:34
usarlo, sed
pero falla. Me había hecho la prueba grep
y awk
no tenía esperanzas de obtener el resultado esperado. Solo me da el registro ocurrido dentro del 23:10:36
cual no es el resultado esperado. Este es mi comando
sed -n '/23:10:36/,/23:11:34/p' stlog.txt
¿Alguien sabe cómo hacer que esto funcione? solo contiene hora sin fecha porque mi programa obtendrá solo la hora actual del sistema y consultará la base de registro solo en la hora actual del sistema.
Respuesta1
Puedo ver dos problemas aquí: 1) el registro parece estar en orden inverso, 2) tiene varias líneas que coinciden con el patrón "final".
(Aunque la línea final tiene 23:10:36,446, que es posterior a 23:10:36,415 en la penúltima línea)
Con el orden inverso, solo obtienes las líneas que coinciden, 23:10:36
ya que sed
comienza a imprimir cuando ve eso y continúa hasta que ve 23:11:34
, que no está allí.
Invertir los patrones (como se muestra a continuación) parecería una solución, pero aún así solo obtendrías la primera línea que coincide con el patrón final, ya que la impresión se detiene cuando ese patrón se ve por primera vez.
sed -n '/23:11:34/,/23:10:36/p' stlog.txt
Aquí hay una awk
solución que debería poder solucionar ese problema:
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
La variable p
controla la impresión y se borra solo después de que se ve el patrón "final" ( e
es 1)yla línea actual ya no coincide con ese patrón.