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 :

Récupérer des variables dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Invité
    Invité(e)
    Par défaut Récupérer des variables dans un fichier
    Bonjour,

    J'ai un fichier txt contenant des lignes comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom_var1:texte1 texte2
    nom_var2:texte3
    Je voudrais dans un script utiliser ce fichier pour définir des variables. Exemple : nom_var1='texte1 texte2'
    J'avais penser à ceci mais ça ne fonctionne pas s'il y a un espace ...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    `sed "s/\(.*\):\(.*\)/export \1='\2'/" config.txt`
    Auriez-vous une idée?

    Merci d'avance

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Ceci devrait le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    eval $(sed -e "s/'/_/g" -e 's/^/export /' -e "s/:/='/" -e "s/$/'/" < config.txt)
    Note: L'instruction "eval" a une mauvaise réputation souvent justifiée. A priori, elle ne devrait pas poser de problème ici.

  3. #3
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    Bonjour,

    J'ai un fichier txt contenant des lignes comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    nom_var1:texte1 texte2
    nom_var2:texte3
    pourquoi a-t-il ce format ?
    as-tu la main dessus ? peux-tu le modifier afin de le sourcer dans ton script sans devoir le modifier ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    j'y vais de ma petite solution également, ça marche aussi bien juste comme on a pas souvent l'occasion d'utiliser les "regex" bash... et accessoirement on évite la substitution de processus, optimisation quoi, imaginons qu'on ait un fichier avec 4M de variables à parcourir ça va plus vite...


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read line; do eval "${line%%:*}='${line##*:}'"; done < config.txt

  5. #5
    Invité
    Invité(e)
    Par défaut
    Merci à tous. Ca semble bien faire ce que je veux

    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    pourquoi a-t-il ce format ?
    as-tu la main dessus ? peux-tu le modifier afin de le sourcer dans ton script sans devoir le modifier ?
    J'ai bien la main dessus. Je suis en train de faire des tests pour voir ce qu'il est possible de faire.
    J'avais penser aussi à mettre ça directement dans le script si je ne pouvais pas faire de fichier de config

    Pour rentrer dans les détails, j'ai repris un vieux script contenant un awk. Il était horrible à comprendre, vive les dizaine de if/else imbriqués juste pour tester une variable avant de traiter quelques lignes.
    Je l'ai pas mal simplifié (beaucoup moins de variable), plus de if (vu qu'on fait un test sur le début d'une ligne, on peux tester la variable en même temps)
    Mais on me demande d'améliorer ça pour le rendre évolutif. Ils voudraient donc un fichier de config qu'on peut modifier sans toucher au scripts (ils ont peur ne pas comprendre le script et de le casser en le modifiant).

    Il me reste à voir si j'arrive à utiliser ces variables pour les intégrer dans le awk. J'ai déjà intégré une autre variable contenant une date, donc ça devrait être possible.

  6. #6
    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,

    mouai, tout ça est bien flou.

    1. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk -vtoto=3 '{print toto;}' fichier
      pour faire rentrer la variable toto dans awk
    2. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk '/:/{sub("^.*:","",$0);print;}' fichier
      pour supprimer ce qu'il y a avant ':'
    3. Code : Sélectionner tout - Visualiser dans une fenêtre à part
      awk '/:/{sub("^.*:","",$0);tableau[FNR]=$0}' fichier
      pour avoir un tableau dont chaque ligne est une valeur.

  7. #7
    Invité
    Invité(e)
    Par défaut
    Je récupère ma variable du fichier config et je l'utilise comme ceci dans awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk 'BEGIN {print '$ma_variable'}' fichier

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    je plussoie l'idée de Flodelarab d'utiliser un tableau, et j'ajouterais d'alimenter le tableau en lisant le fichier de conf. dans l'instance BEGIN :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ cat fichier.conf 
    toto:titi tata
    titi:toto tata
    tata:titi toto
    $ awk 'BEGIN{while(getline <"./fichier.conf"){split($0,a,":");tableauConf[a[1]]=a[2]}}
           END{for(i in tableauConf)print i" -- "tableauConf[i]}' fichierAtraiter
    tata -- titi toto
    toto -- titi tata
    titi -- toto tata
    ici, j'utilise END pour afficher le tableau, mais bien sûr, il est accessible "dans le corps" du script awk.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    Invité
    Invité(e)
    Par défaut
    L'idée du tableau initialisé dans le BEGIN est géniale.
    Je suis (de nouveau) arrivé à faire ce que je voulais grâce à vous tous.

    Pour info, J'ai utilisé le code suivant dans mes tests de ligne de awk et ça fonctionne très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (type_elt in tableauConf) && substr($0,1,2) == "AA"
    Merci

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

Discussions similaires

  1. Récupérer des variables dans un fichier de conf
    Par Takka dans le forum Langage
    Réponses: 3
    Dernier message: 10/06/2014, 16h14
  2. Réponses: 7
    Dernier message: 10/01/2013, 16h39
  3. récupérer des variables d'un fichier dans un shell
    Par chloro69 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 11/03/2008, 14h49
  4. Réponses: 2
    Dernier message: 16/01/2006, 19h34
  5. Réponses: 5
    Dernier message: 21/10/2005, 11h48

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