#1 Le 07/10/2017, à 23: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, à 21:34)
Hors ligne
#2 Le 08/10/2017, à 07: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, à 07:44)
Hors ligne
#3 Le 08/10/2017, à 12: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, à 13: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, à 13: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, à 14: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, à 21:33
- migrec
Re : [Résolu] Afficher avec sed un bloc contenant un motif
Merci !
Hors ligne