Précédent   Forum des professionnels en informatique > Systèmes > Linux > Applications > Shell
Shell Vos questions sur l'utilisation des commandes shell
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 08/04/2011, 16h38   #1
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
Par défaut lire dans un fichier

Bonjour je veux créer un script .sh pour lire dans un fichier .txt et me retourner les valeurs j'ai fais ceci:


Code :
1
2
3
4
5
6
7
8
9
10
11
12
cat < conf.txt | while true
do
   read ligne
   if [ "$ligne" = "" ]; then break; fi
   set -- $ligne
   nom=$1
   adresse=$2
   volume=$3
   versio=$4
   systeme=$5
   echo nom=$1, adresse=$2, volume=$3, version=$4, system=$5
done
Cela me retourne mes valeurs mais je ne peux pas m'en resservir car j'utilise un do et je voudrai savoir comment faire svp?
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/04/2011, 17h06   #2
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
explication sur l'UUoC

ensuite pour ton code :
c'est le fait que tu utilises un while true qui pose problème ducoup tu quittes jamais ta boucle...

Code :
1
2
3
4
5
6
7
8
9
while read ligne
do 
   nom=$1
   adresse=$2
   volume=$3
   version=$4 # en plus là tu oulies le "n"
   systeme=$5
   echo nom=$1, adresse=$2, volume=$3, version=$4, system=$5
done < conf.txt
ça devrait marcher.
et surtout tu pourras cette fois ci te re servir de tes variables
voir même re diriger tes résultats vers un fichier...si nécessaire
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 17h27   #3
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
Merci de ta réponse
J'ai essayer ton programme mais il ne me renvois plus rien je m'explique

dans mon conf.txt j'ai :

ceci est un test e

lorsque mon script lit je devrai avoir

nom=ceci, adresse=est, volume=un, version=test, system=e

hors j'ai

nom=, adresse=, volume=, version=, system=
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 08/04/2011, 17h43   #4
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
Un exemple plus concret de ce que je veux
J'ai mon fichier conf.txt

Paros 192.168.20.10 C: 2c windows
Aztse01 192.168.20.11 sdb1 2c windows

a l'aide d'un script.sh
je voudrai aller lire chaque mot et les associer à un argument pour pouvoir m'en servir dans une commande après.

Voila en espérant m’être bien exprimé
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 08/04/2011, 18h02   #5
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
ok mai la methode n'est pas la même dans ce cas...

tu dois pas lire ligne à ligne mais colonne à colonne

inspires toi de ce test
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
 
francois@trillian:~$ cd /tmp
francois@trillian:/tmp$ mkdir test
francois@trillian:/tmp$ cd test
francois@trillian:/tmp/test$ cat > conf.txt
Paros 192.168.20.10 C: 2c windows
Aztse01 192.168.20.11 sdb1 2c windows
francois@trillian:/tmp/test$ while read ligne ; do 
> nom=$(echo $ligne | awk '{print $1}')
> address=$(echo $ligne | awk '{print $2}')
> disk=$(echo $ligne | awk '{print $3}')
> os=$(echo $ligne | awk '{print $4}')
> echo "  HOST:$nom ADRESSE:$adress DISK:$disk OS:$os " >> results.formated
> done < conf.txt
francois@trillian:/tmp/test$ cat results.formated 
  HOST:Paros ADRESSE: DISK:C: OS:2c 
  HOST:Aztse01 ADRESSE: DISK:sdb1 OS:2c 
francois@trillian:/tmp/test$ cd ..
francois@trillian:/tmp$ rm -rf ./test/
francois@trillian:/tmp$ cd
francois@trillian:~$
bien sur c'est mal de faire un awk à chaque fois mais c'est juste pour te faire comprendre le principe de découpage...

optimises après une fois que tu maitrise la solution

PS: tu notera au passage la faute de frappe qui à interdit l'apparition de l'adresse IP mais ça c'était pour voir si tu suivais et j'ai compté que 4 variables au lieu de 5 colonnes ... mais c'est juste un exemple donc ..... à toi d'adapter maintenant...


une dernière chose : pour faire propre quand tu utilises une pile de données comme ça .... une matrice de 5 champs sur N lignes
ça vaut le coup d'utiliser une tableau de variable plustot qu'une variable pour chaque...
l'avantage est de pouvoir valoriser le tableau dans la boucle et traiter les données après la boucle plustot que dedans...
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 18h51   #6
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
aller pour le fun je le refais vite mais mieux :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
 
francois@trillian:~/test$ while read ligne ; do  
for i in {1..5} ; do table[$i]=$(echo $ligne | awk -v _i_=$i '{print $_i_'}) ; done
echo >> resultat
echo "   HOST=${table[1]} - ADRESSE=${table[2]} - PARTITION=${table[3]} - INFO=${table[4]} - OS=${table[5]} " >> resultat
done < conf.txt
francois@trillian:~/test$ cat resultat 
 
   HOST=Paros - ADRESSE=192.168.20.10 - PARTITION=C: - INFO=2c - OS=windows 
 
   HOST=Aztse01 - ADRESSE=192.168.20.11 - PARTITION=sdb1 - INFO=2c - OS=windows 
francois@trillian:~/test$
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 19h27   #7
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Code :
1
2
3
4
5
read -a tableau <<< "foo bar baz"
printf '%s\n' "${tableau[@]}"
foo 
bar
baz
non, mais.
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/04/2011, 20h02   #8
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
excellent le raccourci pratique !

je suis un abruti j'ai même pas pensé à printf...bon en même temps c'est vendredi soir ... je dois être fatigué


Code :
1
2
3
4
5
6
7
8
 
francois@trillian:/tmp$ while read ligne; do 
> read -a tableau <<< $(echo $ligne)
> printf '%s\n' "HOST:${tableau[0]} ADD:${tableau[1]} DISK:${tableau[2]} INFO:${tableau[3]} OS:${tableau[4]}"
> done < toto
HOST:Paros ADD:192.168.20.10 DISK:C: INFO:2c OS:windows
HOST:Aztse01 ADD:192.168.20.11 DISK:sdb1 INFO:2c OS:windows
francois@trillian:/tmp$ rm toto
y'a une méthode pour faire encore plus propre ? (décidément bash commence à me plaire de plus en plus, même si c'est beaucoup moins portable)
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 08/04/2011, 20h25   #9
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
Salut,

Si je puis me permettre...

Pour une variable la syntaxe est la suivante :
Code :
1
2
3
4
5
francois@trillian:/tmp$ while read ligne; do 
> read -a tableau <<< $(echo $ligne)
read -a tableau <<<${ligne}
...
Pour une commande on emploie plutôt :

Code :
 read -a tableau < <(echo ${ligne})
__________________
$ man woman
Il n'y a pas de page de manuel pour woman.
zipe31 est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/04/2011, 20h27   #10
Expert Confirmé Sénior
 
Avatar de N_BaH
 
Inscription : février 2008
Messages : 2 070
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 2 070
Points : 4 153
Points : 4 153
Code :
1
2
3
while read -a tableau
do printf 'HOST: %s ADD: %s DISK: %s INFO: %s OS: %s\n' "$tableau[@]}"
done <toto
voir aussi : Comment lire/parcourir un fichier ?
N_BaH est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 08/04/2011, 20h54   #11
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
merci pour lui
et je prend bonne note des methodes tableau du bash... et de son maitre N_BaH
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 09h01   #12
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
désolé de revenir si tard mais j'étais en week end,
Je vous remercie pour vos solutions. Je vais lire tout cela et voir ce que je peux en retirer =) =) =)
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 09h19   #13
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
j'ai un peu de mal a vous suivre je n'ai pas un super niveau.
J'ai regardé ce que vous avez fait mais j'ai du mal car moi j'aimerais récupérer les arguments pour en faire un fichier je m'explique
Sur la première ligne je récupére Aztse01_C: et j'écris des information dedans en fonction de l'adresse ip de la version et du système genre snmpget...

Voila pouvez-vous m'éclairer s'il vous plait ?

Si vous ne comprenez pas ce que je veux n’hésitez pas .
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 09h42   #14
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
while read ligne; do
 read -a tableau <<< $(echo $ligne)
 printf '%s\n' "HOST:${tableau[0]} ADD:${tableau[1]} DISK:${tableau[2]} INFO:${tableau[3]} OS:${tableau[4]}"
 touch ${tableau[0]}_${tableau[2]}
 chmod 777 ${tableau[0]}_${tableau[2]}
 
        if [ ${tableau[4]} = windows ]
                then
                        oid_disk=`snmpwalk -v 2c -c ${tableau[3]} ${tableau[1]} .1.3.6.1.4.1.9600.1.1.1.1.1 | grep $volume | awk -F "." '{print $8"."$9"."substr($10,0,index($10,"="))}'`
 
 
                        echo "$oid_disk" > ${tableau[0]}_${tableau[2]}
 
 
                else if [ $tableau[4] = unix ]
                        then
                                oid_disk=`snmpwalk -v 2c -c public $host .1.3.6.1.4.1.2021.13.15.1.1.2 | grep $volume | awk -F "." '{print substr($2,0,index($2,"="))}'`
 
 
                                echo "$oid_disk"  > ${tableau[0]}_${tableau[2]}
 
 
 
                fi
        fi
 
 done < conf.txt
Donc cela me crée bien mes fichiers que je désirais mais cela ne m’écris pas dans les fichiers que je viens de créer une idée ?
Cela viens peut être du echo ??

En fait ça marche avec une redirection vers le fichier que je viens de créer ^^
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 01
Vieux 11/04/2011, 09h51   #15
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
ajoutes les redirections vers les fichiers concernés
par exemple

Code :
1
2
 
commande >> ${tableau[0]}_${tableau[2]}
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 10h13   #16
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
oui j'ai trouvé la réponse en fouillant je suis content de moi =)

Merci pour toutes vos réponses, je passe le sujet en résolu

juste pour info il faut un signe supérieur ou deux ??

> ou >> ?
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 11/04/2011, 10h54   #17
Expert Confirmé Sénior
 
Avatar de frp31
 
Homme francois
Ingénieur systèmes et réseaux
Inscription : juillet 2006
Messages : 3 534
Détails du profil
Informations personnelles :
Nom : Homme francois
Âge : 35
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations professionnelles :
Activité : Ingénieur systèmes et réseaux
Secteur : Aéronautique - Marine - Espace - Armement

Informations forums :
Inscription : juillet 2006
Messages : 3 534
Points : 7 743
Points : 7 743
C'est à toi de le savoir, selon ce que tu veux faire :
> nouvelles_données (efface le fichier si il existe déjà)
>> ajouter_données (à la suite du fichier si il existe déjà)
tu choisis.
frp31 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/04/2011, 11h30   #18
Membre habitué
 
Homme Fabrice
Lille
Inscription : février 2011
Messages : 137
Détails du profil
Informations personnelles :
Nom : Homme Fabrice
Localisation : France

Informations professionnelles :
Activité : Lille
Secteur : Services à domicile

Informations forums :
Inscription : février 2011
Messages : 137
Points : 109
Points : 109
merci
fbb53 est déconnecté   Envoyer un message privé Réponse avec citation 10
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 04h32.


 
 
 
 
Partenaires

Hébergement Web