Estoy intentando buscar en un archivo de registro las actividades registradas que no se completaron. Por ejemplo, registro una "Actividad de inicio para ID 1234 ..." y si tiene éxito, la siguiente línea será "Actividad 1234 completada".
Estoy tratando de obtener las líneas "Iniciando ..." que NO son seguidas por sus correspondientes líneas "Completadas".
Archivo de registro de ejemplo
Starting activity for ID 1234
ID 1234 completed successfully
Starting activity for ID 3423
ID 3423 completed successfully
Starting activity for ID 9876
ID 9876 completed successfully
Starting activity for ID 99889
ID 99889 completed successfully
Starting activity for ID 10011
ID 10011 completed successfully
Starting activity for ID 33367
Starting activity for ID 936819
ID 936819 completed successfully
En este ejemplo, estaría buscando que la salida sea:
Starting activity for ID 33367
... porque no es seguido por una línea "completada".
He intentado hacer esto con grep
y awk
, pero no he tenido mucho éxito. Supongo que se puede hacer con una de esas herramientas, pero my grep
and awk
chops no están avanzados.
En busca de una rápida y fiable grep
o awk
patrón para dar los resultados que necesito aquí.
Respuestas:
Aquí hay una
awk
alternativa:Salida:
La
I
matriz asociativa realiza un seguimiento de los identificadores que se han visto.fuente
I[$5] = 1
, solo puedes usarI[$5]
. (No le importa el valor, solo quiere hacer que el elemento exista , y simplemente nombrarlo logra eso).Esto eliminará de la salida todas las líneas de entrada que no estén seguidas por una línea que coincida con la cadena completada .
fuente
Así es como podría hacerlo con GNU sed:
N
lee una línea más en el espacio del patrón.d
) y se reinicia el ciclo.P
) y elimínelo (D
).fuente
-r
que no es necesario, ¿verdad?+
cuantificador.Si su instalación admite pcregrep, la opción multilínea (-M) es útil.
Inicio de actividad para ID 33367
fuente