[BASH] soucis de variable
Résolu/Fermé13 réponses
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 14:21
22 avril 2009 à 14:21
[tmpfs]$ cat list.db toto 12 tata 14 titi 16 tutu 12 tete 12 bobo 14 baba 18 bibi 14 bubu 12 [tmpfs]$ cat error.db tata 14 bubu 12 [tmpfs]$ cat foo.sh #! /bin/sh #set -xv while read line do num="$(grep -c ${line//[^0-9]/} < list.db)" sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 4 rapportfinal > rapportrange [tmpfs]$ ./foo.sh [tmpfs]$ cat rapportfinal tata 14 = 3 bobo 14 = 3 bibi 14 = 3 toto 12 = 4 tutu 12 = 4 tete 12 = 4 bubu 12 = 4 [tmpfs]$ cat rapportrange tutu 12 = 4 toto 12 = 4 tete 12 = 4 bubu 12 = 4 tata 14 = 3 bobo 14 = 3 bibi 14 = 3 [tmpfs]$
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 avril 2009 à 15:08
23 avril 2009 à 15:08
#! /bin/bash set -xv while read line do num="$ (grep -c ${line//[^0-9]/} < list.db)" var="$(grep -o '[0-9][0-9]*' <<<${line})" sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 3 rapportfinal > rapportrangeLa ligne en gras, il y a un espace entre "$" et "(" et il n'en faut pas !!!
Recopies-le (enfin copie/colle) comme ça :
#! /bin/bash set -xv while read line do num="$(grep -c ${line//[^0-9]/} < list.db)" var="$(grep -o '[0-9][0-9]*' <<<${line})" sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 3 rapportfinal > rapportrange
petit up ?
Arf ... :/ J'suis quasi sur en plus que c'est un petit truc de rien du tout mais je coince c'est horrible ! >.<
Arf ... :/ J'suis quasi sur en plus que c'est un petit truc de rien du tout mais je coince c'est horrible ! >.<
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 13:43
22 avril 2009 à 13:43
#! /bin/sh #set -xv while read line do num="$(grep -c ${line//[^0-9]/} < list.db)" sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 4 rapportfinal > rapportrange
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
salut jipicy :D
j'ai essayé ton script mais il ne semble pas vouloir marcher j'ai dut faire une erreur quelque part :$
j'ai copier donc ce script :
#! /bin/sh
#set -xv
while read line
do
num="$(grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal.txt
done < error.db
sort -n -r -k 4 rapportfinal.txt > rapportrange.txt
et il m'affiche a chaque lancement :
./monscript: 9: Bad substitution
./monscript: 9: Bad substitution
j'ai essayé ton script mais il ne semble pas vouloir marcher j'ai dut faire une erreur quelque part :$
j'ai copier donc ce script :
#! /bin/sh
#set -xv
while read line
do
num="$(grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal.txt
done < error.db
sort -n -r -k 4 rapportfinal.txt > rapportrange.txt
et il m'affiche a chaque lancement :
./monscript: 9: Bad substitution
./monscript: 9: Bad substitution
GEANT CA MARCHE !!
Tu es un dieu pour moi ! *.* !
J'ai pas compris ce qui s'est passé : j'ai recopié ton script et ca marchait pas, j'ai modifié ca marchait toujours pas et quand je l'ai re-recopié ... Ca a marché ... Enfin l'essentiel est que ca marche parfaitement !
Une simple question : je test en remplacant les nombres dans list.db et error.db par des numéros plus long et de type numéros de téléphones (10 chiffres significatifs et commençant par des zéros) à priori il faut faire quelques modifications ...
j'ai fait ceci :
#! /bin/sh
set -xv
while read line
do
num=" $(grep -c ${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/} < error.db)"
sed -n "\#${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
le petit soucis est qu'à priori il ne semble plus vouloir compter ... ^^' il me releve une fois chaque ligne de error.db et puis c'est tout ... J'ai dut mal faire une commande :$ ...
note : les fichiers sont de la forme :
list.db :
toto 0123456789
tata 0555555555
titi 0677775555
tutu 0123456789
tete 0123456789
bobo 0555555555
baba 0987654321
bibi 0555555555
bubu 0123456789
error.db :
toto 0123456789
bobo 0555555555
et il m'affiche :
rapportfinal :
toto 0123456789 1
bobo 0555555555 1
rapportrange :
bobo 0555555555 1
toto 0123456789 1
P.S. : j'espere avoir prit le bon argument pour la commande sort et bien le tout dernier nombre et non une partie du numéro de tel :$ ...
Tu es un dieu pour moi ! *.* !
J'ai pas compris ce qui s'est passé : j'ai recopié ton script et ca marchait pas, j'ai modifié ca marchait toujours pas et quand je l'ai re-recopié ... Ca a marché ... Enfin l'essentiel est que ca marche parfaitement !
Une simple question : je test en remplacant les nombres dans list.db et error.db par des numéros plus long et de type numéros de téléphones (10 chiffres significatifs et commençant par des zéros) à priori il faut faire quelques modifications ...
j'ai fait ceci :
#! /bin/sh
set -xv
while read line
do
num=" $(grep -c ${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/} < error.db)"
sed -n "\#${line//[0][1-6][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
le petit soucis est qu'à priori il ne semble plus vouloir compter ... ^^' il me releve une fois chaque ligne de error.db et puis c'est tout ... J'ai dut mal faire une commande :$ ...
note : les fichiers sont de la forme :
list.db :
toto 0123456789
tata 0555555555
titi 0677775555
tutu 0123456789
tete 0123456789
bobo 0555555555
baba 0987654321
bibi 0555555555
bubu 0123456789
error.db :
toto 0123456789
bobo 0555555555
et il m'affiche :
rapportfinal :
toto 0123456789 1
bobo 0555555555 1
rapportrange :
bobo 0555555555 1
toto 0123456789 1
P.S. : j'espere avoir prit le bon argument pour la commande sort et bien le tout dernier nombre et non une partie du numéro de tel :$ ...
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
22 avril 2009 à 17:22
22 avril 2009 à 17:22
Non il ne faut rien changer au script, laisser le script tel que je l'ai écrit !
[tmpfs]$ cat list.db toto 0123456789 tata 0555555555 titi 0677775555 tutu 0123456789 tete 0123456789 bobo 0555555555 baba 0987654321 bibi 0555555555 bubu 0123456789 [tmpfs]$ cat error.db toto 0123456789 bobo 0555555555 [tmpfs]$ cat foo.sh #! /bin/sh #set -xv while read line do num="$(grep -c ${line//[^0-9]/} < list.db)" sed -n "\#${line//[^0-9]/}# {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 4 rapportfinal > rapportrange [tmpfs]$ ./foo.sh [tmpfs]$ cat rapportfinal toto 0123456789 = 4 tutu 0123456789 = 4 tete 0123456789 = 4 bubu 0123456789 = 4 tata 0555555555 = 3 bobo 0555555555 = 3 bibi 0555555555 = 3 [tmpfs]$ cat rapportrange tutu 0123456789 = 4 toto 0123456789 = 4 tete 0123456789 = 4 bubu 0123456789 = 4 tata 0555555555 = 3 bobo 0555555555 = 3 bibi 0555555555 = 3 [tmpfs]$Édit : Si la partie avec "sed" pose problème, tu peux l'écrire autrement :
#! /bin/sh #set -xv while read line do num="$(grep -c ${line//[^0-9]/} < list.db)" var="$(grep -o '[0-9][0-9]*' <<<${line})" sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal done < error.db sort -n -r -k 4 rapportfinal > rapportrange
Bonjour !
Merci beaucoup pour ton aide Jipicy ! Ca marche presque ! J'ai utilisé les deux versions de ce script en y apportant une légère modification car il ne veut pas marcher sinon, il s'agit du tout début ou je suis obligé de mettre #! /bin/bash au lieu de #! /bin/sh sinon il bloque, j'espère que ca ne modifie pas trop le script au niveau du codage :$ ...
alors donc j'ai fait :
#! /bin/bash
set -xv
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
var="$(grep -o '[0-9][0-9]*' <<<${line})"
sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
ou bien :
#! /bin/bash
set -xv
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
et il m'affiche toujours le même résultat :
control@poc:~/check_modems$ ./test.sh
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
+ read line
+ num='$ (grep -c 0123456789 < list.db)'
+ sed -n '\#0123456789# {s/.*/& $ (grep -c 0123456789 < list.db)/p}' list.db
+ read line
+ num='$ (grep -c 0555555555 < list.db)'
+ sed -n '\#0555555555# {s/.*/& $ (grep -c 0555555555 < list.db)/p}' list.db
+ read line
sort -n -r -k 3 rapportfinal > rapportrange
+ sort -n -r -k 3 rapportfinal
control@poc:~/check_modems$ cat rapportfinal
toto 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tutu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tete 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
bubu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tata 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
bobo 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
bibi 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
control@poc:~/check_modems$
arf ! C'est vraiment a deux doigts de se finir XD.
Merci beaucoup pour ton aide Jipicy ! Ca marche presque ! J'ai utilisé les deux versions de ce script en y apportant une légère modification car il ne veut pas marcher sinon, il s'agit du tout début ou je suis obligé de mettre #! /bin/bash au lieu de #! /bin/sh sinon il bloque, j'espère que ca ne modifie pas trop le script au niveau du codage :$ ...
alors donc j'ai fait :
#! /bin/bash
set -xv
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
var="$(grep -o '[0-9][0-9]*' <<<${line})"
sed -n "/${var}/ {s/.*/& = ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
ou bien :
#! /bin/bash
set -xv
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
sort -n -r -k 3 rapportfinal > rapportrange
et il m'affiche toujours le même résultat :
control@poc:~/check_modems$ ./test.sh
while read line
do
num="$ (grep -c ${line//[^0-9]/} < list.db)"
sed -n "\#${line//[^0-9]/}# {s/.*/& ${num}/p}" list.db >> rapportfinal
done < error.db
+ read line
+ num='$ (grep -c 0123456789 < list.db)'
+ sed -n '\#0123456789# {s/.*/& $ (grep -c 0123456789 < list.db)/p}' list.db
+ read line
+ num='$ (grep -c 0555555555 < list.db)'
+ sed -n '\#0555555555# {s/.*/& $ (grep -c 0555555555 < list.db)/p}' list.db
+ read line
sort -n -r -k 3 rapportfinal > rapportrange
+ sort -n -r -k 3 rapportfinal
control@poc:~/check_modems$ cat rapportfinal
toto 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tutu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tete 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
bubu 0123456789 $ (grep -c 0123456789 < routeurs_modem01.db)
tata 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
bobo 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
bibi 0555555555 $ (grep -c 0555555555 < routeurs_modem01.db)
control@poc:~/check_modems$
arf ! C'est vraiment a deux doigts de se finir XD.
youps j'ai oublié mal reformulé XD
control@poc:~/check_modems$ cat rapportfinal
toto 0123456789 $ (grep -c 0123456789 < list.db)
tutu 0123456789 $ (grep -c 0123456789 < list.db)
tete 0123456789 $ (grep -c 0123456789 < list.db)
bubu 0123456789 $ (grep -c 0123456789 < list.db)
tata 0555555555 $ (grep -c 0555555555 < list.db)
bobo 0555555555 $ (grep -c 0555555555 < list.db)
bibi 0555555555 $ (grep -c 0555555555 < list.db)
control@poc:~/check_modems$
voila c'est mieux comme ca ;).
control@poc:~/check_modems$ cat rapportfinal
toto 0123456789 $ (grep -c 0123456789 < list.db)
tutu 0123456789 $ (grep -c 0123456789 < list.db)
tete 0123456789 $ (grep -c 0123456789 < list.db)
bubu 0123456789 $ (grep -c 0123456789 < list.db)
tata 0555555555 $ (grep -c 0555555555 < list.db)
bobo 0555555555 $ (grep -c 0555555555 < list.db)
bibi 0555555555 $ (grep -c 0555555555 < list.db)
control@poc:~/check_modems$
voila c'est mieux comme ca ;).
En effet je viens de constater que mon copier coller a fonctionner de travers ... XD
MERCIIIIIIIII CA MARCHE !!! J'suis trop content merci a toi Jipicy :D :D :D :D !!!!
MERCIIIIIIIII CA MARCHE !!! J'suis trop content merci a toi Jipicy :D :D :D :D !!!!
juste une dernier question, est ce que ca marche si on a des noms tel que
list.db
toto8 0123456789
tata4 0555555555
ti6ti 0677775555
tu1tu 0123456789
tet0e 0123456789
bob1o 0555555555
ba4ba 0987654321
bib5i 0555555555
bubu6 0123456789
car j'ai l'impression qu'il prend tous les nombres qu'il y a sur la ligne.
list.db
toto8 0123456789
tata4 0555555555
ti6ti 0677775555
tu1tu 0123456789
tet0e 0123456789
bob1o 0555555555
ba4ba 0987654321
bib5i 0555555555
bubu6 0123456789
car j'ai l'impression qu'il prend tous les nombres qu'il y a sur la ligne.
jipicy
Messages postés
40842
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 897
23 avril 2009 à 16:44
23 avril 2009 à 16:44
Ben non ça ne marche plus, mais faudrait arrêter de changer les données à tout bout de champs aussi.
La syntaxe a été faite en fonction de ta demande première et sans tenir compte de tous les paramètres changeant... donc il te faut adapter en fonction de tes besoins et des cas susceptibles d'apparaitre un jour ou l'autre.
La syntaxe a été faite en fonction de ta demande première et sans tenir compte de tous les paramètres changeant... donc il te faut adapter en fonction de tes besoins et des cas susceptibles d'apparaitre un jour ou l'autre.