2010-11-10 3 views
1

j'ai besoin d'extraire les demandes d'un fichier journal qui ressemblent à ceci:certain modèle de Extraction journal

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<vehicleRegistration> 
.... XML in between .... 
.... XML in between .... 
.... XML in between .... 
.... XML in between .... 
... at nth line there is line like this <vehicle id="2312313"></vehicle> 
.... XML in between .... 
.... XML in between .... 
</vehicleRegistration> 

La question importante est que vehicleRegistration peut être 5 lignes et parfois 17, sa variable. Il est où mon courant grep a échoué, je:

grep -A 13 "<?xml version=\"1.0\" encoding=\"UTF-8\" standalone=\"yes\"?>" vehicle.log 

également un autre problème est que, parfois une demande peut être envoyée 2 fois ou plus parce que le service peut être indisponible pour une raison quelconque, donc il pourrait y avoir même plusieurs demandes dans le fichier.

Je devrais également exclure les demandes en double, le moyen de savoir que la demande est en double en comparant la ligne nième (pas la dernière ligne) <vehicle id="2312313"></vehicle>, si l'ID du véhicule répété que son un duplicata.

Comment pouvez-vous résoudre ce problème? Suggestions, code, pseudo-code, tout est bienvenu.

EDIT:

fichier journal est pas un fichier xml, juste un fichier contenant un petit pourcentage de demandes xml et je ne peux pas analyser comme XML

EDIT II:

J'ai extrait uniquement la partie enregistrement du véhicule, en utilisant @eugene y une ligne commande perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile, comment puis-je me débarrasser des doublons, les nœuds qui ont le même id de véhicule, je veux conserver une seule copie de ceux-ci.

Répondre

0

Utilisez XPath pour récupérer des nœuds d'élément XML. Il y a beaucoup de cadres pour différents langages de script modernes.

Avec Perl, vous pouvez faire quelque chose comme:

#!/usr/bin/perl 

use strict; 
use warnings; 
use XML::XPath; 

my $file = 'vehicleRegistration.xml'; 
my $xp = XML::XPath->new(filename => $file); 

print "Vehicle id: ".$xp->find('//vehicle/@id')."\n"; 

Si vous avez besoin, analyser votre fichier journal pour extraire la partie du document XML, puis exécutez l'expression XPath sur elle pour récupérer l'élément et les données tu veux.

+0

merci pour votre réponse, que fait-il ci-dessus? imprime l'identifiant du véhicule? Je dois utiliser cet identifiant de véhicule pour me débarrasser de l'ensemble de entre ant

+0

Oui, cela prend le morceau de code XML que vous avez excisé et imprime l'identifiant du véhicule. –

+0

Je voudrais supprimer des noeuds vehicleRegistration, qui contiennent le même id de véhicule que n'importe quels autres noeuds de vehicleRegistration, que diriez-vous que j'irais faire cela? pseudo-code ou code serait génial, ou un tutoriel ou tout ce qui pourrait m'aider à y parvenir. tnx – ant

2

J'utiliserais XML::Simple (ou autre analyseur XML) pour extraire les données. Data::Dumper peut être utilisé pour inspecter les structures de données.

Mise à jour: vous pouvez extraire les vehicleRegistration éléments comme celui-ci:

open my $fh, '<', 'logfile' or die $!;  
my $xml = ""; 

while (<$fh>) { 
    if (m{<vehicleRegistration>} .. m{</vehicleRegistration>}) { 
     $xml .= $_; 
    } 
} 

Ou avec un perl one-liner:

perl -nle 'm{<vehicleRegistration>} .. m{</vehicleRegistration>} and print' logfile 
+0

Je vient de modifier ma question, le fichier journal est un fichier XML ne contient que quelques demandes donc je ne peux pas analyser comme xml – ant

+0

@ c0mrade - Comment ces extraits XML séparés? Pouvez-vous extraire ces blocs XML et les analyser comme suggéré par eugene? – eumiro

+0

@eumiro @eugene y Oui, j'ai séparé la partie XML, comment puis-je me débarrasser des doublons? – ant

0

Utilisez XPath (et en fonction de ce que vous voulez faire avec le résultat, éventuellement Xslt)

Il existe des utilitaires de ligne de commande, here, for example

+0

Désolé, je viens d'éditer ma question, le fichier journal n'est pas un fichier xml il contient juste quelques requêtes donc je ne peux pas l'analyser comme xml – ant

+2

Bien sûr, vous pouvez :) extraire le texte entre et et le passer à un analyseur XML ... –

1

utilisez la commande awk ou gawk dans unix pour extraire l'enregistrement ...

#!/usr/bin/awk -f 

/^<vehicleRegistration>/ { printit="true" } # set the print flag on 
printit ~ "true" { print }     # if printflag set print 
/^</vehicleRegistration>{ printit="false" } # turn print flag off