récupèration de paramètres

récupèration de paramètres - Shell/Batch - Programmation

Marsh Posté le 09-05-2006 à 23:58:26    

bonjour,  
j'ai besoin d'un petit coup de main pour avancer , voici le probléme :
 
J'ai un fichier properties1.conf   composer de paramétres :  
system=unix
disque=20
ram=512
 
properties2.conf
system=unix
disque=20
ram=512
sound=creative
 
je veux un script shell ouvre properties1.conf  récuupère la valeur des paramètres et les reporte dans properties2.conf pour les paramétres identiques sans m'écraser les autres paramètres du fichier comme sound qui ne sont pas concerné par la modification.
 
Merci du coup de main d'avance.

Reply

Marsh Posté le 09-05-2006 à 23:58:26   

Reply

Marsh Posté le 10-05-2006 à 10:55:53    

Regarde FOR /F avec les options Delims et Tokens

Reply

Marsh Posté le 10-05-2006 à 14:19:57    

bassene a écrit :

J'ai un fichier properties1.conf   composer de paramétres :  
system=unix
disque=20
ram=512
 
properties2.conf
system=unix
disque=20
ram=512
sound=creative
 
je veux un script shell ouvre properties1.conf  récuupère la valeur des paramètres et les reporte dans properties2.conf pour les paramétres identiques sans m'écraser les autres paramètres du fichier comme sound qui ne sont pas concerné par la modification.


Il suffit de lire chaque ligne de "properties2" et, si la ligne est dans "properties1", la remplacer par celle-là sinon la garder telle qu'elle
 

bassene a écrit :

je veux un script shell


Bien Monseigneur...
 

#!/bin/sh
# Stockage fichier de conf de base dans buffer 3
exec 3<properties2.conf
 
# Lecture buffer 3 ligne par ligne
while read lig 0<&3
do
 # Si la ligne contient "="
 if echo "$lig" |grep "=" 1>/dev/null
 then
  # Extraction chaine avant =
  token=`echo $lig |cut -f1 -d=`
 
  # Recherche du token suivi de "=" dans properties1.conf
  lig2=`grep "^$token=" properties1.conf`
 
  # Si le token est présent (lig2 non vide)
  if test -n "$lig2"
  then
   # Ecriture de l'autre ligne
   echo "$lig2"
 
   # Passage à la ligne suivante
   continue
  fi
 
  # Ici, la ligne n'y est pas
 fi
 
 # Ici, la ligne ne contient pas "="
 
 # On l'écrit telle qu'elle
 echo "$lig"
done


 
Tu lances le script qui t'affiche à l'écran le résultat. Si c'est correct, tu le rediriges vers un fichier que tu renommes ensuite en "properties2.conf"
 

PepMat a écrit :

Regarde FOR /F avec les options Delims et Tokens


Il parle de script shell Unix, pas batch MsDOS !!!

Message cité 1 fois
Message édité par Sve@r le 10-05-2006 à 14:21:30

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 10-05-2006 à 16:54:07    

Sve@r a écrit :

Il parle de script shell Unix, pas batch MsDOS !!!


 
Oups, ^^
désolé
 
en meme temps c'est meme pas écrit dans le titre,
alors je rejète la faute sur le manque de clarté.
 
De plus, je pensais que la politique de la maison était d'éviter de donner la solution sur un plateau à toute personne qui 'exige' du code sans montrer ce qu'il a déjà produit.
Tu es trop gentil de lui macher tout le travail.

Reply

Marsh Posté le 10-05-2006 à 18:23:09    

PepMat a écrit :

Oups, ^^
désolé
 
en meme temps c'est meme pas écrit dans le titre,
alors je rejète la faute sur le manque de clarté.
 
De plus, je pensais que la politique de la maison était d'éviter de donner la solution sur un plateau à toute personne qui 'exige' du code sans montrer ce qu'il a déjà produit.
Tu es trop gentil de lui macher tout le travail.


 
C'est vrai que le terme "script shell" est noyé dans la masse. Moi, c'est en voyant "systeme=unix" que j'ai compris; puis ensuite j'ai vu "script shell".
 

PepMat a écrit :

Tu es trop gentil de lui macher tout le travail.


En fait, ce sujet m'a intéressé parce que je ne voyais pas, au début, comment le faire. Mais c'est vrai que 1) vu sa façon de donner des ordres et 2) vu la politique de forum, j'aurais vraiment pas dû.
On mettra ça sur le compte "jour de bonté" ;)


Message édité par Sve@r le 10-05-2006 à 18:23:40

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 11-05-2006 à 11:24:56    

bonjour,  
 
merci du coup de main,
 
en ce moment j'ai chngé de méthode :
 
j'ai un fichier qui propertiesParam qui contient une liste de paramétres genre :
--propertiesParam.txt--
system;
soundcard;
disk;
memory;
 
et le script va sur le fichier properties.conf récupérer la valeur de ces paramètres que sont :
system=unix
soundcard=creative
disk=20
memory=512
 
ainsi un nouveau fichier est générè avec le nouveau contenu des paramètre.
 
voici mon code :
. ./propertiesParam.txt
typeset -i i=1
MYSEDPARAM=""
 
while [ "$PARAMN" -ge "$i" ] ; do
 MYSEDPARAM="$MYSEDPARAM | sed -e \"s/\$IN$i/\$OUT$i/\""
 
 i=$(($i+1))
done
#echo "MYSEDPARAM=$MYSEDPARAM"
$MYSEDPARAM > propertiestest.tmp    
 
avec ce bout de code j'arrive via un sed à faire les report de valeurs mais cé pas encore ce que je cherche.
 
Merci de prendre de votre temps pour me lire.
 
 
 
 
 
 
 
 

Reply

Marsh Posté le 11-05-2006 à 19:19:37    

bassene a écrit :

. ./propertiesParam.txt


J'arrive pas à comprendre pourquoi tu exécutes "propertiesParam.txt" comme si c'était un shell.
Si encore il contenait des lignes "token=valeur" tu obtiendrais des variables mais là...
 

bassene a écrit :

MYSEDPARAM="$MYSEDPARAM | sed -e \"s/\$IN$i/\$OUT$i/\""


Je ne comprends rien à cette ligne. Il te manque "echo" pour que la variable soit affichée et envoyée dans le sed. Et il te manque les backquottes pour que le résultat de cette commande aille dans la variable. Et les backslash après le sed sont inutiles.
A la limite, cette instruction serait correcte et devrait correspondre à ce que j'imagine si c'était écrit ainsi

MYSEDPARAM=`echo $MYSEDPARAM | sed -e "s/\$IN$i/\$OUT$i/"`


Mais même là, je n'arrive pas à comprendre où est-ce qu'on trouve la chaîne "$IN" dans la variable "MYSEDPARAM" ou ailleurs...
 
Sinon tu te compliques quand-même bien la vie...
1) tu récupères chaque ligne de "propertiesParam.txt" se terminant par ";"
2) tu supprimes ce ";" => tu obtiens un token (un mot significatif)
3) tu vas rechercher la ligne commençant par ce token suivi de "=" dans "properties.conf" et tu écris cette ligne
 
Ce script est même plus court que le premier

#!/bin/sh  
# Boucle sur les lignes finissant par ";"
grep ";$" propertiesParam.txt |while read lig
do  
    # Suppression du ";" final
    token=`echo $lig |sed -e "s/;$//"`
 
    # Recherche du token dans "properties.conf" et écriture
    grep "^$token=" properties.conf
done > propertiestest.tmp


 
Ce tuto devrait combler pas mal de tes lacunes en shell...
=> http://fr.lang.free.fr/cours/Shell_v1.4.pdf


Message édité par Sve@r le 11-05-2006 à 19:32:25

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 12-05-2006 à 12:25:17    

En fait c'est à partir d'un script type je dois l'industrialiser.
tu as d'un File.list qui contient une liste de fichiers
---File.list--  
fichier1.txt
fichier2.txt
 
Et fichier1.param et fichier2.param qui contiennent une liste de paramètres de fichier1.txt et fichier2.txt
--fichier1.param--
system;
disk;  
ram;
--fichier2.param--
system;
disk;  
memory;
 
Donc mon programme dois prendre en entrée File.list et récupérer un nom de fichier (fichier1.txt puis fichier2.txt ...) et ouvrir leur correspondant fichier1.param lire les paramètres qui'ils contiennent et aller les extraire depuis fichier1.txt puis fichier2.txt
 
---fichier1.txt--
system=unix
disk=20  
ram=512
 
Voilà en tout l'utilité de mon script j'espère avoir été clair niveau explication.
Suis débutant en shell, merci pour le lien Sve@r.

Reply

Marsh Posté le 12-05-2006 à 19:01:07    

bassene a écrit :

En fait c'est à partir d'un script type je dois l'industrialiser.
tu as d'un File.list qui contient une liste de fichiers
---File.list--  
fichier1.txt
fichier2.txt
 
Et fichier1.param et fichier2.param qui contiennent une liste de paramètres de fichier1.txt et fichier2.txt
--fichier1.param--
system;
disk;  
ram;
--fichier2.param--
system;
disk;  
memory;
 
Donc mon programme dois prendre en entrée File.list et récupérer un nom de fichier (fichier1.txt puis fichier2.txt ...) et ouvrir leur correspondant fichier1.param lire les paramètres qui'ils contiennent et aller les extraire depuis fichier1.txt puis fichier2.txt
 
---fichier1.txt--
system=unix
disk=20  
ram=512
 
Voilà en tout l'utilité de mon script j'espère avoir été clair niveau explication.
Suis débutant en shell, merci pour le lien Sve@r.


 
Pas vraiment compliqué. Au lieu de traiter un fichier avec son nom en dur, il suffit de les prendre un par un dans "File.list". Faut juste englober le script précédent avec une boucle intelligente et créer soi-même les noms des fichiers à partir du nom lu

#!/bin/sh  
 
# Stockage de "File.list"
exec 3<File.list
 
# Lecture de "File.list" ligne par ligne
while read file 0<&3
do
    # Création du nom du fichier param (remplacer ".txt" par ".param" )
    param=`echo $file |sed -e "s/\.txt$/\.param/"`
 
    # Petit affichage parce que c'est agréable de voir son script s'exécuter
    echo "Traitement de $param et $file - Ecriture dans $file.tmp"
 
    # Boucle sur chaque lignes du fichier paramètre finissant par ";"  
    grep ";$" "$param" |while read lig  
    do  
        # Suppression du ";" final  
        token=`echo $lig |sed -e "s/;$//"`  
 
        # Recherche du token dans fichier txt et écriture dans fichier tmp
        grep "^$token=" "$file"
    done > "$file.tmp"
 
    # Traitement terminé - Passage au fichier suivant
done


Message édité par Sve@r le 12-05-2006 à 19:16:36

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 15-05-2006 à 15:21:58    

j'ai lancé ton script mais le fichier temporaire crée est vide  penses tu qu'il n'arrives pas à récupèrer ce qui est aprés le token ?

Reply

Marsh Posté le 15-05-2006 à 15:21:58   

Reply

Marsh Posté le 16-05-2006 à 20:01:31    

bassene a écrit :

j'ai lancé ton script mais le fichier temporaire crée est vide  penses tu qu'il n'arrives pas à récupèrer ce qui est aprés le token ?


 
Hum... j'ai tapé ce script sans le tester... et je pourrai pas le tester avant le 22 mai (suis pas au burau avant cette date).
Tu peux essayer de mettre "set -x" avant le "grep" et "set +x" après le grep histoire que le débugging t'affiche la ligne "grep" réellement exécutée.
 
Sinon, il y a ptet un truc à corriger
Au lieu de
        # Suppression du ";" final  
        token=`echo $lig |sed -e "s/;$//"`  
 
Mettre
        # Suppression du ";" final  
        token=`echo $lig |sed -e "s/;\$//"`  
 
Sinon ça doit être un truc de ce style
Mais le meilleur debugging est l'affichage des variables histoire de voir si elles contiennent bien ce qu'elles devraient contenir...


Message édité par Sve@r le 16-05-2006 à 22:01:37

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 18-05-2006 à 19:47:26    

#grep -e "$LINE" ../mco_stage1/$1/$FILE >> ../mco_tmp/$FILE.diff
   
echo "grep -e "$LINE" ../mco_stage2/$1/$FILE | sed -e "s/\$LINE//" ../mco_stage2/$1/$FILE"
 
voici deux commande la première en commentaire marche , mais la seconde ne tourne pas quelqu'un peut il me dire pourquoi.
 
Je veux que la valeur de mon grep soit remplacer par un espace dans le fichier concerné.
 
 

Reply

Marsh Posté le 19-05-2006 à 11:18:24    

bassene a écrit :

#grep -e "$LINE" ../mco_stage1/$1/$FILE >> ../mco_tmp/$FILE.diff
   
echo "grep -e "$LINE" ../mco_stage2/$1/$FILE | sed -e "s/\$LINE//" ../mco_stage2/$1/$FILE"
 
voici deux commande la première en commentaire marche , mais la seconde ne tourne pas quelqu'un peut il me dire pourquoi.


Dans la 2°, je ne comprends pas trop le "echo". Mais le plus gros problème de la 2° ligne, c'est que tu donnes à "sed" 2 éléments à traiter
- le fichier "../mco_stage2/$1/$FILE"
- l'entrée standard venue du pipe
En tout état de cause, "sed" ne pourra pas traiter les 2 éléments...
 

bassene a écrit :

Je veux que la valeur de mon grep soit remplacer par un espace dans le fichier concerné.


res=`grep -e "$LINE" ../mco_stage2/$1/$FILE`
if test -z "$res"
then
    sed -e "s/$res/ /" ../mco_stage2/$1/$FILE >/tmp/fic.$$
    mv /tmp/fic.$$ ../mco_stage2/$1/$FILE
fi


Message édité par Sve@r le 19-05-2006 à 11:19:09

---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
Reply

Marsh Posté le 19-05-2006 à 14:59:54    

Merci pour ton aide , le script tourne correctement.
 
bon week end.

Reply

Sujets relatifs:

Leave a Replay

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