J'ai un fichier qui est de 20 - 80 + Mo de taille qui est un certain type de fichier log.
Il enregistre l'un de nos processus et ce processus multi-threaded. Par conséquent, le fichier de log est une sorte de gâchis. Voici un exemple:
Le fichier journal se présente comme suit: "DATE TIME - THREAD ID - Détails", et un nouveau fichier est créé pour chaque jour
Citation:
20090409 000122 - BD0 - 123 de départ session
20090409 000122 - BD0 - Traitement 1
20090409 000122 - BD0 - Plus de traitement
20090409 000123 - EF0 - Ordre de départ session 234
20090409 000124 - EF0 - Traitement
20090409 000124 - BD0 - Traitement 2
20090409 000125 - BD0 - Plus de traitement
20090409 000125 - EF0 - Traitement
20090409 000125 - DD1 - Annuler les 345 de départ session
20090409 000125 - DD1 - Traitement
20090409 000126 - DD1 - Traitement 2
20090409 000126 - BD0 - 123 fermeture
20090409 000127 - 11F - 543 Requête de départ session
20090409 000127 - 11F - Traitement
..
..
20090409 000135 - 11F - Query 543 fermeture
..
20090409 000140 - EF0 - Commander 234 fermeture
..
..
..
20090409 000143 - DD1 - Annuler la fermeture de 345
|
Maintenant, voici où il obtient d'être une douleur ... J'ai besoin d'extraire les lignes de "Starting session" à "Fin de session" pour chaque ID de thread, et le dump de ces fichiers séparés. CEPENDANT, les ID de thread peut être reproduite au cours d'une journée - mais habituellement pas pour de nombreuses heures.
Une session peut durer de 30 secondes à 4 minutes ou si (~ 1200 lignes) dans le fichier log, et il ne peut y avoir jusqu'à 20 sessions simultanées.
Maintenant, j'ai quelque chose qui fonctionne - bien que très lentement. Je finis par grepper et sedding le dossier et plus. Lorsque le fichier est gros, il faut une grande quantité de temps. J'espère que quelqu'un ici peut m'aider à optimiser cela. Si possible, j'aimerais utiliser bash.
Merci,
Eric
Voici le code que je travaille, mais il est _slow_
Code:
if [[ -e "$log_file" ]]
then
echo "parsing: "$log_file
grep "starting session" $log_file | while read line
do
thread=`echo $line | cut -d' ' -f4`
sessiontype=`echo $line | cut -d' ' -f6`
sessionnumber=`echo $line | cut -d' ' -f7`
echo " first line of session: "${line:0:25}"..."
line2=`echo - $thread - $sessiontype $sessionnumber shutting down`
echo " last line of session: "${line2:0:25}"..."
sed -n "/$line/,/$line2/p" $log_file | grep " - $thread - ">session.$thread.$sessiontype.$sessionnumber
done
....
Cela me donne un certain nombre de fichiers, que l'utilisation de l'exemple ci-dessus log sera créé, comme indiqué ci-dessous:
Citation:
file: session.BD0.Order.123
20090409 000122 - BD0 - 123 de départ session
20090409 000122 - BD0 - Traitement 1
20090409 000122 - BD0 - Plus de traitement
20090409 000124 - BD0 - Traitement 2
20090409 000125 - BD0 - Plus de traitement
20090409 000126 - BD0 - 123 fermeture
file: session.DD1.Cancel.345
20090409 000125 - DD1 - Annuler les 345 de départ session
20090409 000125 - DD1 - Traitement
20090409 000126 - DD1 - Traitement 2
..
..
..
20090409 000143 - DD1 - Annuler la fermeture de 345
file: session.11F.Query.543
20090409 000127 - 11F - 543 Requête de départ session
20090409 000127 - 11F - Traitement
..
..
20090409 000135 - 11F - Query 543 fermeture
file: session.EF0.Order.234
20090409 000123 - EF0 - Ordre de départ session 234
20090409 000124 - EF0 - Traitement
20090409 000125 - EF0 - Traitement
20090409 000140 - EF0 - Commander 234 fermeture
|