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 08/08/2008, à 09:17

yag00

[Resolu]Shell : recupération de données dans une chaine

bonjour

dans un shell, j'ai une commande qui me renvoie une chaine de caractère sur deux ligne formaté comme ceci :

Number of field:      3
field:           field1,field2,field3

je cherche à récupérer le nombre de champ ainsi que la liste

nbfield=$($commande | awk '/Number of field:/ { print $NF }')

for (( i=0; i<$nbfield; i++ ))
do
        echo $i
        field[$i]= ??????
        echo $field $field[$i] 
done

je récupère bien le nombre de champs smile
j'ai bricolé avec awk pour récupérer les champ dans un tableau sans succès ?? sad
comment faire?  hmm

j'espere que vous pourrez m'aider avec ce code, merci


Edit : j'ai essayé de coder ceci en perl mais ne connaissant pas bien le perl je ne suis pas arriver à une solution correcte  : si vous avez une solution en perl je suis preneur aussi, merci

Dernière modification par yag00 (Le 08/08/2008, à 14:10)

Hors ligne

#2 Le 08/08/2008, à 10:03

Totor

Re : [Resolu]Shell : recupération de données dans une chaine

Voilà une solution (sans avoir testé) :

resCmd=$(${commande})
nbfield=$(echo ${resCmd} | awk '/Number of field:/ { print $NF }')
fields=$(echo ${resCmd} | |sed  '/^field:/!d;s/field://')
for (( i=0; i<$nbfield; i++ ))
do
        echo $i
        field[$i]=$(echo ${fields}|awk -F"," -v numChp=$i '{print $numChp}')
        echo $field[$i] 
done

EDIT :
où ceci :

resCmd=$(${commande})
nbfield=$(echo ${resCmd} | awk '/Number of field:/ { print $NF }')
fields=$(echo ${resCmd} | |sed  '/^field:/!d;s/field://')
for (( i=0; i<$nbfield; i++ ))
do
        echo $i
        field[$i]=$(echo ${fields}||cut -f${i} -d",")
        echo $field[$i] 
done

Dernière modification par Totor (Le 08/08/2008, à 10:06)


-- Lucid Lynx --

Hors ligne

#3 Le 08/08/2008, à 13:31

yag00

Re : [Resolu]Shell : recupération de données dans une chaine

merci
pour la commande avec sed ça marche nickel

je récupère donc dans fields la chaine suivante : field1,field2,field3

par contre la suite ne fonctionne pas : découper et mettre chaque champ dans un tableau

Hors ligne

#4 Le 08/08/2008, à 13:40

Totor

Re : [Resolu]Shell : recupération de données dans une chaine

fields=$(echo ${resCmd} | |sed  '/^field:/!d;s/field://')

à remplacer par

fields=$(echo ${resCmd} | sed  '/^field:/!d;s/field://')

et

field[$i]=$(echo ${fields}||cut -f${i} -d",")

par

field[$i]=$(echo ${fields}|cut -f${i} -d",")

(erreur de syntaxe : double pipe dans les 2 cas)

après... peux-tu poster tes sorties d'erreur/standard ?
ça m'orienterait dans mes recherches !


-- Lucid Lynx --

Hors ligne

#5 Le 08/08/2008, à 13:53

yag00

Re : [Resolu]Shell : recupération de données dans une chaine

merci
j'avais corrigé l'erreur du double pipe

en fait le problème ne vient pas de la commande cut qui fonctionne très bien mais de l'affectation de la valeur dans le tableau

for (( i=1; i<=$nbfield; i++ ))
do
        echo $i
        field=$(echo ${fields}|cut -f${i} -d",")
        echo $field
done

me renvoi bien

1
field1
2
field2
3
field3

si je fais

for (( i=1; i<=$nbfield; i++ ))
do
        echo $i
        field[$i]=$(echo ${fields}|cut -f${i} -d",")
        echo $field[$i] 
done

j'obtiens

1
[1]
2
[2]
3
[3]

Hors ligne

#6 Le 08/08/2008, à 14:05

Totor

Re : [Resolu]Shell : recupération de données dans une chaine

Bon, voilà encore plus simple. Tu remplaces tout le code par :

field=($(${commande}| sed  '/^field:/!d;s/field://;s/,/ /g'))

et la variable field est de type tableau et contient tout tes fields.
Attention, l'indice du tableau commence à 0.
Pour accèder à un élément du tableau :

echo ${field[<indice>]}

et normalement, la taille est donnée comme suit :

echo ${#field}

mais je ne comprends pas, ça donne toujours 1 sad (alors qu'avec le tableau que j'ai utilisé, il y avait 3 éléments)

enfin : pour afficher la totalité du tableau :

echo ${field[*]}


-- Lucid Lynx --

Hors ligne

#7 Le 08/08/2008, à 14:09

yag00

Re : [Resolu]Shell : recupération de données dans une chaine

merci beacoup pour ton aide
ca marche nickel smile

et le code précédent marchait aussi wink

c'est juste que j'ai oublié les {} hmm

echo $field[$i] == faux
echo ${field[$i]} == smile

Hors ligne

#8 Le 08/08/2008, à 14:51

Totor

Re : [Resolu]Shell : recupération de données dans une chaine

ok, c'est cool.
Entre deux, j'ai compris pourquoi ${#field} me retournait toujours 1...

Tout simplement car ce n'est pas la bonne syntaxe yikes

alors la voici :

echo ${#field[*]}

...


-- Lucid Lynx --

Hors ligne

#9 Le 08/08/2008, à 16:41

HP

Re : [Resolu]Shell : recupération de données dans une chaine

yikes super intéressant !

Je ne savais même pas que les tableaux existaient en bash… j'avais encore rien lu à ce sujet, ni sur le web, ni dans mes bouquins (qui ne doivent pas être assez bon, d'ailleurs)…


cat /dev/urandom >/dev/null 2>&1 #github

Hors ligne