2010-11-12 8 views
0

Contenu de events<xyz>.log:script shell unix pour analyser les journaux en utilisant grep

<log> 
<time>09:00:30</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>john</id> 
</log> 
<log> 
<time>09:00:35</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>steve</id> 
</log> 
<log> 
<time>09:00:40</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 
<id>john</id> 
</log> 

Je veux extraire les balises Entrée1 et inscription2 de toutes <log> entrées avec <id> « john » dans un fichier. Je veux le faire dans un script shell qui regarderait tous les fichiers * .log dans un répertoire. La sortie devrait être similaire à ce qui suit.

Contenu de a.out:

<time>09:00:30</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 

<time>09:00:40</time> 
<entry1>abcd</entry1> 
<entry2>abcd</entry2> 

Je suis nouveau shell script, mais j'ai essayé avec quelques commandes de base à au moins regarder les journaux:

$ grep -B 3 -in '<id>john</id>' * > /tmp/a.out 

commande ci-dessus me donne sortie avec 3 lignes au-dessus de l'étiquette d'identification pour john comme suit

... 
events111.log-100- <time>09:00:40</time> 
events111.log-101- <entry1>abcd</entry1> 
events111.log-102- <entry2>abcd</entry2> 
events111.log-103- <id>john</id> 
.... 
events112.log-200- <time>06:56:03</time> 
events112.log-201- <entry1>abcd</entry1> 
events112.log-202- <entry2>abcd</entry2> 
events112.log-203- <id>john</id> 

Ceci est bien, mais le problème est que -3 lignes ne fonctionnera pas à chaque fois, il pourrait y avoir plus de balises entre les deux, donc il y a une logique d'analyse nécessaire pour trouver le texte de <time> à </id>.

J'apprécierais vraiment de vous aider à formuler un script pour cela.

Merci!

Répondre

2

Avez-vous envisagé d'utiliser un outil de greffe xml comme xml starlet pour repérer les pièces de ces fichiers journaux? Ce serait beaucoup plus propre.

+0

wow! xml starlet est un excellent outil! J'essaie d'utiliser le xml sel {