Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#1 Le 11/02/2011, à 17:55

cartouche699

Parser en une foisun fichier en shell

Bonjour,

J'ai un fichier texte contenant des informations de ce style :

<exception msisdn="06" sessionSVI="15" date="11/02/2011" heure="04:11:04">
<context>
(Exception sur plusieurs lignes)
</context>
<returnCode>TO  </returnCode>
<requete>gketr</requete>
</exception>


A partir de ce fichier, je dois afficher uniquement le contenu de la balise context selon la valeur de la balise requete.

Par exemple, je souhaite récupérer tous les context de la requete  gketr.

Pouvez-vous m'aider ?

Merci à tous

Hors ligne

#2 Le 12/02/2011, à 17:32

WW

Re : Parser en une foisun fichier en shell

Salut @cartouche699,

Si ton fichier est toujours formaté de cette manière tu peux faire ça avec des filtres :

grep -B3 "<requete>gketr</requete>" file | grep -B1 "</context>" | grep -v "</context>" | grep -v "\-\-"

Pour les deux premiers, utilisation de l'option -B (before) pour récupérer les lignes précédant celles qui correspondent au filtre.
Ensuite l'option -v pour exclure les lignes correspondant au filtre.

Ici :
grep -B3 "<requete>gketr</requete>" file permet de récupérer les 3 lignes précédant la requête gketr dans le fichier "file".
grep -B1 "</context>" puis sur ces lignes on récupère la ligne précédant les balises context.
grep -v "</context>" balise que l'on supprime
grep -v "\-\-" enfin on supprime le délimiteur "--" ajouter par l'option -B (en fonction de l'affichage souhaité tu peux te baser sur ce délimiteur pour séparer les résultats)

Note : Il y a bien sûr plein de possibilité pour améliorer les filtres, et certainement beaucoup d'autres manières dont certaines plus efficaces.

Dernière modification par WW (Le 12/02/2011, à 18:35)


Quand on sait c'est facile, mais qui n'a jamais été débutant.

Hors ligne

#3 Le 12/02/2011, à 18:01

cartouche699

Re : Parser en une foisun fichier en shell

Merci beaucoup pour cette réponse très précise et surtout très bien expliquée.
En plus ça fonctionne nickel . MERCI

Est ce que tu sais comment je peux combiner les filtres.
J'aimerai en plus de filtrer sur la balise context filtrer sur le contenu du champ MSISDN

Merci beaucoup

Hors ligne

#4 Le 12/02/2011, à 19:16

WW

Re : Parser en une foisun fichier en shell

De rien.

grep -B5 "<requete>gketr</requete>" file | grep -A2 "msisdn=\"06\"" | grep -v "^<\|\-\-"
  1. grep -B5 "<requete>gketr</requete>" file : permet de récupérer les 5 lignes précédant la requête gketr dans le fichier "file".

  2. grep -A2 "msisdn=\"06\"" : permet de récupérer les 2 lignes suivant (option -A (after)) celle contenant msisdn=06.

  3. grep -v "^<\|\-\-" : permet de supprimer les lignes commenant par "<" ou contenant "--".

- Note 1 : En shell pour utiliser les caractères réservés au langage shell il faut les échapper(protéger) avec \.
- Note 2 : Si tu as besoin de rendre un filtre insensible à la case : option -i.
- Note 3 : L'utilitaire grep permet d'utiliser des expressions régulières.

Ici ^< | -- (sans les caractères d'échappement pour plus de lisibilité) :

  1. ^ : signifie commence par

  2. | : signifie ou

En bonus :

  1. Cours sur les filtres

  2. ShellUnix, utilitaires puissants sed, awk et le langage Perl pour les traitements plus complexes

  3. Guide avancé d'écriture des scripts Bash


Quand on sait c'est facile, mais qui n'a jamais été débutant.

Hors ligne