[BASH] soucis de variable

Résolu
Bonjour,
c'est encore moi ! Mais je touche au but ! (rageant de voir qu'on est pas si loin arg ! :D)

voila aujourd'hui j'ai quelques petits soucis avec un script en bash toujours :

je me retrouve avec deux fichiers :

list.db :

toto 12
tata 14
titi 16
tutu 12
tete 12
bobo 14
baba 18
bibi 14
bubu 12

error.db :

tata 14
bubu 12

le but de mon script est de lire chaque ligne de error.db et en prenant le numéro (deuxieme colonne), de comparer avec list.db puis relever chaque ligne dans list.db pour les placer dans un nouveau fichier rapportnum.txt
Une fois cela fait, il compte le nomre de fois qu'apparait le numéro dans le nouveau fichier et le note sur la ligne.
Après, une fois tout cela fait, il range les numéro du plus important au moins important (du nombre de fois ou il apparait le plus grand au moins grand).

cela parait un peu brouillon mais je vais vous montrer mon script :

#!/bin/bash

set -x

#lecture ligne par ligne

oldIFS=$IFS # sauvegarde du separateur de champ
IFS=$'\n' # nouveau separateur de champ, le caractere fin de ligne
for ligne in $(cat error.db)
do

./linecomand $line
var="$(grep -c $? list.db )";sed -n "/$2/ {s/.*/& $var/p}" error.db >> rapportnum.txt

done
IFS=$old_IFS # retablissement du separateur de champ par déefaut


sort -n -r -k 3 rapportnum.txt >> rapportranger.txt

(merci à Jipicy pour son script de lecture ligne par ligne :D)

avec un petit script linecomand qui permet de relever le numéro de la deuxième colonne dans error.db

#!/bin/bash

cat $2


je devrais avoir normalement :

rapportnum.txt :

tata 14 3
bobo 14 3
bibi 14 3
toto 12 4
tutu 12 4
tete 12 4
bubu 12 4

rapportranger.txt :

toto 12 4
tutu 12 4
tete 12 4
bubu 12 4
tata 14 3
bobo 14 3
bibi 14 3

voila, le soucis étant qu'à priori ca coince eu niveau de :

./linecomand $line
var="$(grep -c $? list.db )"

car il n'arrive pas a relevé le numéro :'( ...

si quelqu'un pouvait m'aider se serait super, merci d'avance et merci à tous pour m'avoir aider à arriver jusque la :D j'y connaissait rien en bash et maintenant je me sens moins démunis face à ce langage.

13 réponses

  1. 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 ! >.<
    1. Modérateur
      #! /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
      
      1. 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
        1. Modérateur
          [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]$
          1. 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 :$ ...
            1. Modérateur
              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
              1. 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.
                1. 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 ;).
                  1. Modérateur
                    #! /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 
                    La 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 
                    1. 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 !!!!
                      1. 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.
                        1. Modérateur
                          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.
                          1. ok merci désolé j'apprend a chaque fois de nouveaux trucs, je passe par palier si tu vois ce que je veux dire ;).

                            Merci beaucoup pour l'aide apporter :D.