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 10/05/2016, à 12:16

waduxair

[résolu] permutation de données avec sed

Bonjour à tous,
J'ai un problème pour l'utilisation de la commande sed pour permuter des chaînes de caractères dans une ligne.
Je m'explique. J'essaye d'extraire depuis le ldap des données sur l'uid, le sn et le givenname afin de les transmettre par la suite dans un fichier csv.

Avec l'utilisation des commandes grep et sed, je suis arrivé à un résultat qui correspond à ceci :

sn:nom1,givenname:prenom1,uid:numero1,
sn:nom2,givenname:prenom2,uid:numero2,
sn:nom3,givenname:prenom3,uid:numero3,

etc...

Mon problème se compose en deux parties. Premièrement, j'ai quelques lignes (une minorité) qui s'affiche dans cette ordre :

givename:prenom4,sn:nom4,uid:numero4,

OU

uid:numero5,givenname:prenom5,sn:nom5,

Et deuxièmement, je souhaite afficher un résultat final sous la forme suivante :

givenname:prenom6,sn:nom6,uid;numero6,

Ma question est donc la suivante :est-il possible de permuter les chaînes de caractères dans une ligne de façon à avoir toutes les lignes qui commencent par givenname, puis sn et enfin uid ?
Je pense que l'utilisation de sed peut résoudre mon problème, mais si vous avez une autre idée (par exemple traitement par boucle), je suis preneur aussi.
Merci d'avance pour votre aide.

Dernière modification par waduxair (Le 11/05/2016, à 13:34)

Hors ligne

#2 Le 10/05/2016, à 13:03

pingouinux

Re : [résolu] permutation de données avec sed

Bonjour,
Comment fais-tu pour distinguer les différents types de lignes, qui ont toutes la même structure ?

Ajouté : À moins que givenname, sn et uid ne soient des mots-clés

Dernière modification par pingouinux (Le 10/05/2016, à 13:05)

Hors ligne

#3 Le 10/05/2016, à 13:33

JeanLucJ

Re : [résolu] permutation de données avec sed

Salut,

C'est possible par sed, et probablement awk aussi.

Par contre, je pense que tu ne feras pas ce tri tous les 4 matins... pourquoi ne pas directement utiliser un tableur si le résultat attendu est un csv?
Il est possible (avec openoffice, office...) d'importer le fichier et de traiter les données pour définir "," comme séparateur de colonne.

Ensuite, organiser les colonnes, chercher manuellement les listes où les éléments sont dans le désordre et remettre d'équerre.

Via tableur c'est un poil plus long, mais il faudra plus de temps pour mettre au point la commande qui va bien.
Il y a sur xkcd un diagramme marrant qui donne, en fonction de la fréquence d'une tâche manuelle et de sa dure, le temps qu'il est raisonnable d'investir pour l'automatiser. On voit que pour les tâches peu fréquentes et rapide (ton besoin, possiblement), le temps d'automatisation raisonnable se chiffre en minutes  smile

Hors ligne

#4 Le 10/05/2016, à 13:45

pingouinux

Re : [résolu] permutation de données avec sed

Voici le script python ranger.py :

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

rec=re.compile('(\w+):(\w+),(\w+):(\w+),(\w+):(\w+),')
with open(sys.argv[1]) as f:
   for lig in f:
      k=rec.match(lig)
      if k:
         for i in range(1,7,2):
            if    k.group(i)=='givenname': f1=k.group(i+1)
            elif  k.group(i)=='sn':        f2=k.group(i+1)
            elif  k.group(i)=='uid':       f3=k.group(i+1)
         print("givenname:%s,sn:%s,uid:%s,"%(f1,f2,f3))

À lancer ainsi :

./ranger.py fichier
$ cat fichier
sn:nom1,givenname:prenom1,uid:numero1,
sn:nom2,givenname:prenom2,uid:numero2,
sn:nom3,givenname:prenom3,uid:numero3,
givenname:prenom4,sn:nom4,uid:numero4,
uid:numero5,givenname:prenom5,sn:nom5,

Voici le résultat :

givenname:prenom1,sn:nom1,uid:numero1,
givenname:prenom2,sn:nom2,uid:numero2,
givenname:prenom3,sn:nom3,uid:numero3,
givenname:prenom4,sn:nom4,uid:numero4,
givenname:prenom5,sn:nom5,uid:numero5,

Hors ligne

#5 Le 10/05/2016, à 13:52

waduxair

Re : [résolu] permutation de données avec sed

Merci pour vos réponses rapides

pingouinux a écrit :

Comment fais-tu pour distinguer les différents types de lignes, qui ont toutes la même structure ?

Ajouté : À moins que givenname, sn et uid ne soient des mots-clés

Dans l'ordre, j'utilise un ldapsearch pour extraire mes champs (givenname, sn et uid) qui s'affichent ligne par ligne, comme dans l'exemple ci-dessous :

sn:nom1
givenname:prenom1
uid:numero1
sn:nom2
givenname:prenom2
uid:numero2
sn:nom3
givenname:prenom3
uid:numero3

J'ajoute une virgule à chaque fin de ligne pour que le résultat soit compatible csv, puis je concatène toutes les trois lignes pour en faire une seule, ce qui me donne le résultat affiché dans mon premier message avec les incohérences d'ordre dans certaines lignes?


JeanLucJ a écrit :

Salut,

C'est possible par sed, et probablement awk aussi.

Par contre, je pense que tu ne feras pas ce tri tous les 4 matins... pourquoi ne pas directement utiliser un tableur si le résultat attendu est un csv?
Il est possible (avec openoffice, office...) d'importer le fichier et de traiter les données pour définir "," comme séparateur de colonne.

Ensuite, organiser les colonnes, chercher manuellement les listes où les éléments sont dans le désordre et remettre d'équerre.

Via tableur c'est un poil plus long, mais il faudra plus de temps pour mettre au point la commande qui va bien.
Il y a sur xkcd un diagramme marrant qui donne, en fonction de la fréquence d'une tâche manuelle et de sa dure, le temps qu'il est raisonnable d'investir pour l'automatiser. On voit que pour les tâches peu fréquentes et rapide (ton besoin, possiblement), le temps d'automatisation raisonnable se chiffre en minutes

Tu as tout à fait raison, si je ne devais faire cette manip' qu'une fois tous les X mois, ce serait plus intéressant de le faire manuellement. Dans mon cas, je dois tenir compte des arrivées et sorties utilisateurs, et il y en a tous les jours. L'export de données du ldap doit être quotidien et automatisé sad

Des idées sur un sed à appliquer pour trier les données ?

EDIT : je vais essayer ton script pingouinux smile

Dernière modification par waduxair (Le 10/05/2016, à 13:53)

Hors ligne

#6 Le 10/05/2016, à 14:07

waduxair

Re : [résolu] permutation de données avec sed

Lorsque j'exécute le script sur le fichier, j'ai l'erreur suivante :

  File "./test.py", line 5
    with open(sys.argv[1]) as f:
            ^
SyntaxError: invalid syntax

Hors ligne

#7 Le 10/05/2016, à 14:11

pingouinux

Re : [résolu] permutation de données avec sed

Pour voir ce dont il s'agit, il faut que tu montres le script complet.
Sinon, il est plus simple de traiter directement le fichier d'origine, 3 lignes à la fois :

$ cat fichier
sn:nom1
givenname:prenom1
uid:numero1
sn:nom2
givenname:prenom2
uid:numero2
sn:nom3
givenname:prenom3
uid:numero3
givenname:prenom4
sn:nom4
uid:numero4
uid:numero5
givenname:prenom5
sn:nom5
#!/usr/bin/python3
import sys

with open(sys.argv[1]) as f:
   ret={}
   for lig in f:
      cle,val=lig.split(':')
      ret[cle]=val[:-1]
      if len(ret)==3:
         for cle in ('givenname','sn','uid'):
            print("%s:%s"%(cle,ret[cle]),end=',')
         print(); ret={}

Hors ligne

#8 Le 10/05/2016, à 14:47

waduxair

Re : [résolu] permutation de données avec sed

Le script complet est le suivant :

#!/bin/bash

ldapsearch -z 0 -xLLL -b "ou=test3,dc=test2,dc=test1" givenname sn uid | grep "\(givenName\|sn\|uid\)" | sed s/$/,/ | sed 'N;N;s/\n//g' > test
./test.py test

Le fichier test.py correspond à la première version du script copié tel quel.

Hors ligne

#9 Le 10/05/2016, à 15:03

JeanLucJ

Re : [résolu] permutation de données avec sed

Dans mon cas, je dois tenir compte des arrivées et sorties utilisateurs, et il y en a tous les jours. L'export de données du ldap doit être quotidien et automatisé sad

Et l'analyse des logs du LDAP ne serait pas un moyen plus efficace?
Je n'ai pas tout le contexte, mais un export quotidien de tout le LDAP, et pas que du diff, me surprend.

Déformation pro : je cherche à comprendre le besoin quand je vois une solution compliquée smile

Hors ligne

#10 Le 10/05/2016, à 17:12

pingouinux

Re : [résolu] permutation de données avec sed

waduwair #8 a écrit :

Le fichier test.py correspond à la première version du script copié tel quel.

Montre quand même le retour complet de

cat test.py

et éventuellement le contenu de test.

Hors ligne

#11 Le 10/05/2016, à 17:13

Postmortem

Re : [résolu] permutation de données avec sed

Salut,

ldapsearch -z 0 -xLLL -b "ou=test3,dc=test2,dc=test1" givenname sn uid | awk -F: '/(sn|givenname|uid):/ { infos[$1]=$2 }
      infos["sn"] && infos["givenname"] && infos["uid"] { printf "givenname:%s,sn:%s,uid:%s,\n", infos["givenname"], infos["sn"], infos["uid"]; split("", infos)}'

Edit : ajout d'une virgule à la fin des lignes affichées.

Dernière modification par Postmortem (Le 10/05/2016, à 17:31)


Mot' a dit : « Un Hellfest sans Slayer, c'est comme une galette-saucisse sans saucisse ! »

Hors ligne

#12 Le 11/05/2016, à 13:33

waduxair

Re : [résolu] permutation de données avec sed

La commande de Postmortem fonctionne.
Merci pour votre aide smile

Hors ligne