IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Utilisation d'un fichier de configuration


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 102
    Par défaut Utilisation d'un fichier de configuration
    Bonjour à tous,


    Je rappelle que je débute en bash

    je souhaiterais travailler avec un fichier de configuration.

    Ce que je veux faire : Modifier une chaine de caractère dans un fichier.xml

    Sans fichier j'utilisais la commande sed pour substituer des valeurs et renvoyer vers un fichier.xml:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -e "s/$valeur1/$valeur2/g" -e "s/$valeur3/$valeur4/g" $ficori > $destination/$ficdef
    En fonction du hostname ou je me trouve, je voudrais faire l'équivalent avec le fichier conf.ini

    Merci à tous pour votre aide

    Je veux pouvoir utiliser un fichier config.ini exp:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    config.ini
     
    Host1:HostnameA
    Centre1:Paris
    valeur2:ServeurBDD
    valeur3:MDP
    valeur4:Host1
     
    Host1:HostnameB
    Centre1:Toulouse
    valeur2:ServeurBDD
    valeur3:MDP
    valeur4:Host2

  2. #2
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 47
    Par défaut
    En fait conceptuellement ton fichier conf.ini n'est pas un fichier de conf à proprement parler.
    C'est juste un fichier d'input avec des valeurs de variables dedans, qui va être processé par ton programme.
    Donc c'est un input et non un fichier de conf.

    Premier point donc.

    Sous bash la manière principale d'utiliser un fichier de configuration, est dans le script principal de "sourcer" le fichier de config.
    Si le script s'appelle toto.sh et que ton fichier de conf s'appelle conf.ini, en début du fichier toto.sh tu auras une ligne du genre :
    conf.ini contenant des constantes qui peuvent varier à chaque exécution si tu les modifies préalablement.

    Le soucis dans un fichier de conf, c'est que si tu attribues plusieurs valeurs a une même variable, seule la dernière sera prise en compte par le script principal.

    Donc ce n'est pas d'un fichier de conf, au sens script dont tu as besoin, mais d'un fichier d'input.

    Ensuite gérer du multiligne est souvent pénible, il est préférable de regrouper tous les éléments d'un bloc sur une même ligne (le parsing étant plus aisé).

    Donc si tu es sûr d'avoir à chaque fois 5 éléments, je te conseille la structure suivante pour ton fichier d'input :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    HostnameA Paris ServeurBDD MDP Host1
    HostnameB Toulouse ServeurBDD MDP Host2
    ....
    Chaque ligne correspondant à un hostname particulier.

    Ensuite dans ton script principal, tu identifies la ligne correspondant au hostname que tu traites (dans le cas où tu lances le script sur chacun des hosts), ou alors une simple boucle while te permet de parcourir ligne par ligne ton fichier input et de tout traiter en une seule boucle.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    While read Host1 Centre1 valeur2 valeur3 valeur4 ; do 
    sed -e "s/$valeur1/$valeur2/g" -e "s/$valeur3/$valeur4/g" $ficori > $destination/$ficdef
    done <<< fichierinput
    C'est juste que dans ton exemple, je ne vois pas de valeur1 dans ton fichier de conf (peut être centre1).
    Et fait attention à bien gérer tes fichier de sortie car ">" écrase le fichier à chaque utilisation. (il te faut ">>" pour ne pas écraser le fichier de sortie et rajouter les modifications à la fin du fichier existant).

    Bon voilà ce que je peux écrire rapidement pour répondre à ta question.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Pardon, mais je ne crois pas que conseiller de faire un while sur les lignes avec un read soit une bon idée. Pour manipuler un fichier texte, il est préférable d'utiliser les outils grep, sed, awk...

    Cependant, je soutiens l'idée de faire un fichier avec des champs, sur une seule ligne, séparés par des points-vigules, façon fichier csv.

    Exemple de retraitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ cat /tmp/exemple.txt
    Host1:HostnameA
    Centre1:Paris
    valeur2:ServeurBDD
    valeur3:MDP
    valeur4:Host1
     
    Host1:HostnameB
    Centre1:Toulouse
    valeur2:ServeurBDD
    valeur3:MDP
    valeur4:Host2
    $ awk -F':' '/^Host1/{nb++;} (nb==1 && $2!=""){a[0]=a[0]$1";";} {a[nb]=a[nb]$2";"} END{for (i in a) {print a[i];}}' /tmp/exemple.txt
    Host1;Centre1;valeur2;valeur3;valeur4;
    HostnameA;Paris;ServeurBDD;MDP;Host1;;
    HostnameB;Toulouse;ServeurBDD;MDP;Host2;

  4. #4
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 47
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour
    Pardon, mais je ne crois pas que conseiller de faire un while sur les lignes avec un read soit une bon idée. Pour manipuler un fichier texte, il est préférable d'utiliser les outils grep, sed, awk...

    Cependant, je soutiens l'idée de faire un fichier avec des champs, sur une seule ligne, séparés par des points-vigules, façon fichier csv.
    There is more than one way to do it.

    Ensuite je répond à la question initiale stipulant bash, qui sait très bien faire ce genre de chose avec du read et une boucle while, justement

    Evidemment awk/perl/python et tant d'autres peuvent faire cela aussi.

  5. #5
    Membre confirmé
    Inscrit en
    Février 2009
    Messages
    102
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 102
    Par défaut Utilisation d'un fichier de configuration
    Merci netmonk pour la réponce,

    cela fonctionne parfaitement.


  6. #6
    Membre éprouvé
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Avril 2015
    Messages
    47
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Finance

    Informations forums :
    Inscription : Avril 2015
    Messages : 47
    Par défaut
    Parfait

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 0
    Dernier message: 21/03/2012, 18h31
  2. [ZF 1.9] Utilisation de plusieurs fichiers de configuration
    Par nosferapti dans le forum MVC
    Réponses: 2
    Dernier message: 20/01/2010, 11h27
  3. Réponses: 2
    Dernier message: 31/10/2006, 16h29
  4. Réponses: 2
    Dernier message: 14/06/2006, 11h53
  5. Réponses: 4
    Dernier message: 01/03/2006, 17h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo