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 08/10/2017, à 00:05

migrec

[Résolu] Afficher avec sed un bloc contenant un motif

Bonjour,

Je parcours un fichier LDIF avec plusieurs milliers d'entrées et je cherche à obtenir le bloc qui commence par "dn: uid=", qui se termine par une ligne vide et qui contient MOTIF

J'arrive à afficher la fin (de mon MOTIF jusqu'à la prochaine ligne vide) avec :

$ sed -ne "/MOTIF/,/^$/p" annuaire.ldif

Mais pas le tout (ni juste le début d'ailleurs).

Une idée ? C'est faisable avec sed ou je dois passer par un autre outil ?

Dernière modification par migrec (Le 08/10/2017, à 22:34)

Hors ligne

#2 Le 08/10/2017, à 08:22

pingouinux

Re : [Résolu] Afficher avec sed un bloc contenant un motif

Bonjour,
Essaye le script en python : recherche_MOTIF.py

#!/usr/bin/python
import sys, re

rec_bloc=re.compile('^dn: uid=.*?MOTIF.*?\n\n',re.M|re.S)
blocs=rec_bloc.findall(sys.stdin.read())

for bloc in blocs: print("%s\n"%bloc.split('\n\n')[-2])

À lancer ainsi :

./recherche_MOTIF.py <annuaire.ldif

Ajouté :
Avec awk

awk '{if($0~/^dn: uid=/){s=$0}else{if(s)s=s ORS $0}} /^$/{if(s~/MOTIF/){print s}s=""}' annuaire.ldif

Dernière modification par pingouinux (Le 08/10/2017, à 08:44)

Hors ligne

#3 Le 08/10/2017, à 13:20

migrec

Re : [Résolu] Afficher avec sed un bloc contenant un motif

Je n'ai jamais utilisé Python... Ça sera l'occasion !
Mais j'ai ceci après avoir fait un CTRL+C :

$ ./rechercheDN.py <annuaire.ldif
^C./rechercheDN.py: ligne 7: erreur de syntaxe près du symbole inattendu « ( »
./rechercheDN.py: ligne 7: `rec_bloc=re.compile('^dn: uid=.*?MOTIF.*?\n\n',re.M|re.S)'

Hors ligne

#4 Le 08/10/2017, à 14:11

pingouinux

Re : [Résolu] Afficher avec sed un bloc contenant un motif

Montre le script tel que tu l'as modifié, car la ligne en erreur est la 4 de mon script en #2 et non la 7.

Voici une version un peu simplifiée :

#!/usr/bin/python
import sys, re

blocs=re.findall('^dn: uid=.*?MOTIF.*?\n\n(?ms)',sys.stdin.read())

for bloc in blocs: print("%s\n"%bloc.split('\n\n')[-2])

Et avec sed :

sed -n '/^dn: uid=/{:a;N;/\n$/!ba;/MOTIF/p}' annuaire.ldif

Hors ligne

#5 Le 08/10/2017, à 14:56

migrec

Re : [Résolu] Afficher avec sed un bloc contenant un motif

La version avec sed me convient parfaitement ! J'ai pas tout compris, je veux bien une explication comme ça je pourrais l'adapter...
/^dn: uid=/     -> toute ligne qui commence par "dn: uid="
{:a;N;/\n$/!ba;/MOTIF/p}   -> ?

Le script Python modifié :

 #!/usr/bin/python
import sys, re

#argument1 = sys.argv[0]
#argument2 = sys.argv[1]

rec_bloc=re.compile('^dn: uid=.*?MOTIF.*?\n\n',re.M|re.S)
blocs=rec_bloc.findall(sys.stdin.read())

for bloc in blocs: print("%s\n"%bloc.split('\n\n')[-2])

J'ai rajouté les arguments pour passer ça en argument plutôt qu'en dur dans le fichier...

Hors ligne

#6 Le 08/10/2017, à 15:53

pingouinux

Re : [Résolu] Afficher avec sed un bloc contenant un motif

C'est parce que tu as laissé une espace au début de la première ligne dans le script python.

sed -n '/^dn: uid=/{:a;N;/\n$/!ba;/MOTIF/p}' annuaire.ldif

Quand on lit l'en-tête, on boucle jusqu'à lire une ligne vide, et on imprime ce que l'on a stocké si MOTIF s'y trouve.

:a          -> C'est une étiquette arbitraire
N           -> Ajout d'une nouvelle ligne au "pattern space"
/\n$/!ba    -> Si le "pattern space ne se termine pas par une ligne vide, on va à l'étiquette "a"
/MOTIF/p    -> Sinon, et si on a rencontré "MOTIF", on imprime le "pattern space"

Hors ligne

#7 Le 08/10/2017, à 22:33

migrec

Re : [Résolu] Afficher avec sed un bloc contenant un motif

Merci !

Hors ligne