[Shell] Traitement de fichier - chaine de caractères

Traitement de fichier - chaine de caractères [Shell] - Shell/Batch - Programmation

Marsh Posté le 12-08-2005 à 15:23:08    

Bonjour à tous,
 
J'aurais besoin de votre aide pour insérer automatiquement une concaténation de chaînes de caractères dans un fichier. Je m'explique:
J'ai un fichier ldif où chaque membres de mon annuaire ldap sont décris de la façon suivante:
 

dn: uid=p1.nom1,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom1
sn: NOM1
givenName: prenom1
 
dn: uid=p2.nom2,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom2
sn: NOM2
givenName: prenom2
(...)


Et ainsi pour environ 900 personnes :sweat:  
 
Il faudrait qu'à partir des champs givenName et sn, je puisse insérer, pour chaque user, un champ cn: de la forme cn: <givenName> <sn>. Ce qui donnerais:
 
 

dn: uid=p1.nom1,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom1
sn: NOM1
givenName: prenom1
cn: prenom1 NOM1
 
dn: uid=p2.nom2,ou=people,dc=domain,dc=fr
objectClass: person
changetype: add
uid: p.nom2
sn: NOM2
givenName: prenom2
cn: prenom2 NOM2
(...)


 
Auriez-vous quelques pistes ? Mes grep & cut habituels ne semblent plus suffirent... J'ai fouillé du côté de l'outil read utilisé aumilieu de boucles mes je galère un peu  :(  
 
Merci d'avance!

Reply

Marsh Posté le 12-08-2005 à 15:23:08   

Reply

Marsh Posté le 12-08-2005 à 16:05:03    

tu n'a jamais essayé les scripts awk ?
 
ca te prendrait qqs minutes à faire avec un code genre :

Code :
  1. ## à chaque ligne parsée, l'afficher
  2. * { print "\n$0" } ## \n utile ??
  3. ## si la ligne commence par "sn:", mémoriser le sn
  4. $1 = "sn:" {sn = $2 }
  5. ## si la ligne est givenName, concaténer name et sn et l'afficher ensuite
  6. $1 = "givenName:"
  7.   {
  8.   name = $2
  9.   printf("\ncn: %s %s", name, sn)
  10.   }


 
le script awk parse ton fichier ligne par ligne et, pour chaque ligne, réalise les instructions à la suite ...
 
et tu n'as plus qu'à appeler ton script  
"awk tonscript.awk tonfichierannuaire.txt > tonnouveaufichierannuaire.txt"
 
va voir là pour plus d'informations sur les scripts awk :
http://w3.uqah.uquebec.ca/DOC/unx_awk.html


Message édité par gagaches le 12-08-2005 à 16:12:20
Reply

Marsh Posté le 12-08-2005 à 16:11:25    

Si ce n'est pas trop indiscret, pourrais-tu préciser quel est le système d'exploitation, même s'il semble que cela soit de l'unix ? Est-ce pour le Korn-shell ou le C-shell ? Est-ce que chaque paragraphe se termine toujours par une ligne vide ? Est-ce qu'il peut-y avoir des lignes vides à l'intérieur d'un paragraphe ? Ou bien faut-il insérer systématiquement au niveau de la 7eme ligne ?
 
Voici une petite solution, que je n'ai pas testée, mais qui peut donner une idée


   cat lefichier.txt | while read laligne
   do
      letag=`echo $laligne |cut -d":" -f1`
      if [ $letag = "sn" ]
      then
         lenom=`echo $laligne |cut -d":" -f2`
      fi
      if [ $letag = "givenname" ]
      then
         leprenom=`echo $laligne |cut -d":" -f2`
      fi
      if [ $laligne="" ]
      then
         echo "cn: " $leprenom " " $lenom
      fi
 
      # recopie la ligne dans stdout
      echo $laligne
 
   done


Reply

Marsh Posté le 12-08-2005 à 16:21:45    

utilise perl/python/ruby, y a tout ce qu'il faut pour faire du ldap simplement.

Reply

Marsh Posté le 12-08-2005 à 16:42:55    

D'abord merci pour vos réponses!

Citation :

tu n'a jamais essayé les scripts awk ?


Non et je crois qu'il est temps de rattraper ce retard!
 

Citation :

Si ce n'est pas trop indiscret, pourrais-tu préciser quel est le système d'exploitation, même s'il semble que cela soit de l'unix ? Est-ce pour le Korn-shell ou le C-shell ? Est-ce que chaque paragraphe se termine toujours par une ligne vide ? Est-ce qu'il peut-y avoir des lignes vides à l'intérieur d'un paragraphe ? Ou bien faut-il insérer systématiquement au niveau de la 7eme ligne ?


Non pas d'Unix mais une simple Fedora 3 avec un bon vieux bash. Concernant la structure des fichiers ldif, chaque paragraphe doit se terminer par une ligne vide (et donc pas de ligne vide dans le paragraphe même) Quand à l'insertion, peu importe sa place dans le paragraphe (je la voyais bien en dernière ligne).
 

Citation :

utilise perl/python/ruby, y a tout ce qu'il faut pour faire du ldap simplement.


Ouais mais en fait il n'y a rien de spécifique à ldap là dedans. Ca aurait très bien pu être un ficher texte tout bête avec des champs identique. En plus Python et Ruby me sont complètement inconnus...
 
Mon domaine est d'habitude le réseau et c'est assez rare que j'aligne du code (à part des sh tous simple) ... Enfin je fouille tout ça et je vous tiens au courant!

Reply

Marsh Posté le 12-08-2005 à 17:44:22    

Avec ça :
 

Code :
  1. BEGIN { FS=":" }
  2. {
  3. if ( $1 ~ /sn/ ) {
  4. sn=$2
  5. print "sn :" sn  }
  6. else {
  7. if ( $1 ~ /givenName/ ) {
  8. givenName=$2
  9. print "givenName:" givenName
  10. print "cn:" givenName sn}
  11. else print $0
  12. }
  13. }


ça marche au poil ! Encore merci de votre aide à tous !


Message édité par lalas le 12-08-2005 à 18:32:31
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed