J'essaie de rechercher dans un fichier journal des activités enregistrées qui ne se sont pas terminées. Par exemple, j'enregistre une "Activité de démarrage pour l'ID 1234 ..." et en cas de succès, la ligne suivante sera "Activité 1234 terminée".
J'essaye d'obtenir les lignes "Starting ..." qui ne sont PAS suivies de leurs lignes "Completed" correspondantes.
Exemple de fichier journal
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
Dans cet exemple, je rechercherais que la sortie soit:
Starting activity for ID 33367
... car il n'est pas suivi d'une ligne "terminée".
J'ai essayé de faire cela avec grep
et awk
, mais je n'ai pas eu beaucoup de succès. Je suppose que cela peut être fait avec l'un de ces outils, mais mes grep
et awk
côtelettes ne sont pas avancés.
Vous cherchez un rapide et fiable grep
ou awk
modèle pour donner les résultats dont j'ai besoin ici.
Réponses:
Voici une
awk
alternative:Production:
Le
I
tableau associatif garde une trace des identifiants qui ont été vus.la source
I[$5] = 1
, vous pouvez simplement utiliserI[$5]
. (Vous ne vous souciez pas de la valeur, vous voulez simplement faire exister l'élément , et simplement le nommer accomplit cela.)Cela supprimera de la sortie toutes les lignes d'entrée qui ne sont pas suivies d'une ligne correspondant à la chaîne terminée .
la source
Voici comment vous pouvez le faire avec GNU sed:
N
lit une ligne de plus dans l'espace de motif.d
) et le cycle est redémarré.P
) et supprimez-la (D
).la source
-r
n'est pas nécessaire, non?+
quantificateur.si votre installation prend en charge pcregrep, l'option multiligne (-M) est très pratique.
Activité de démarrage pour ID 33367
la source