IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

Nombre de colonnes dans une variable


Sujet :

Shell et commandes GNU

  1. #1
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut Nombre de colonnes dans une variable
    Bonjour,

    J'aimerai pouvoir compter le nombre de colonne que possède une variable afin de débloquer un script suivant le nombre de colonne.
    Je m'explique :

    Je récupère plusieurs valeurs (max 5) dans ma variable : $myvar, dont voici un exemple : 17,8 23,9 24,1 23,7 0

    J'aimerai connaitre le nombre de colonne que contient ce valeur afin de lui appliquer le script qui lui convient

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    #Affectation des variables
    #Cas 5 valeurs
    temp_ext=$(echo $myvar | awk '{print $1}')
    temp_int_z1=$(echo $myvar | awk '{print $2}')
    temp_int_z2=$(echo $myvar | awk '{print $3}')
    temp_int_z3=$(echo $myvar | awk '{print $4}')
    temp_DJU=$(echo $myvar | awk '{print $5}')
     
    #Cas 4 valeurs
    temp_ext=$(echo $myvar | awk '{print $1}')
    temp_int_z1=$(echo $myvar | awk '{print $2}')
    temp_int_z2=$(echo $myvar | awk '{print $3}')
    temp_DJU=$(echo $myvar | awk '{print $4}')
     
    #Cas 3 valeurs
    temp_ext=$(echo $myvar | awk '{print $1}')
    temp_int_z1=$(echo $myvar | awk '{print $2}')
    temp_DJU=$(echo $myvar | awk '{print $3}')
    Merci par avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    ton raisonnement ne me paraît pas correct; tu peux nous en dire plus sur ce qui le motive ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo '17,8 23,9 24,1 23,7 0' | awk -F',' '{print NF}'
    5
    mais bash possède la possibilité d'utiliser des tableaux :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ var='17,8 23,9 24,1 23,7 0'
    $ IFS="," read -a ar <<<"$var"
    $ echo "${#ar[@]}"
    5
    $ printf '%s\n' "${ar[@]}"
    17
    8 23
    9 24
    1 23
    7 0
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci !

    Mon objectif est de monitorer ces valeurs au travers du logiciel Centreon, et pour cela je dois créer un plu-gin Nagios.

    Une agence peut possèder jusqu'à 5 sondes, donc 5 valeurs.
    Je veux prendre en compte tous les cas possible y compris ceux où une agence ne compte que 3 sondes.
    Selon le nombre de sonde, le traitement de la donnée diffère :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #Affectation des variables
    #Cas 5 valeurs
    temp_DJU=$(echo $myvar | awk '{print $5}')
     
    #Cas 4 valeurs
    temp_DJU=$(echo $myvar | awk '{print $4}')
     
    #Cas 3 valeurs
    temp_DJU=$(echo $myvar | awk '{print $3}')
    Les valeurs ne se positionne pas dans la même colonne selon le nombre de sonde

    Après il est possible que je ne prenne pas le chemin le plus court, dans ce cas là je ne suis pas contre un peu d'aide

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Code BASH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ var='17,8 23,9 24,1 23,7 0'
    $ IFS=',' read -a tableau <<<"$var"
    $ temp_DJU="${tableau[@]:(-1)}"
    $ unset tableau[${#tableau[@]}-1]
    $ echo $temp_DJU 
    7 0
    $ printf '%s\n' "${tableau[@]}"
    17
    8 23
    9 24
    1 23
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé Avatar de papajoker
    Homme Profil pro
    Développeur Web
    Inscrit en
    Septembre 2013
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nièvre (Bourgogne)

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Septembre 2013
    Messages : 2 101
    Points : 4 446
    Points
    4 446
    Par défaut
    bonjour,
    si j'ai bien compris (separateur espace - 2 valeurs au milieu optionelles) c'est juste une petite adaptation du code de N_BaH :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    var='17,8 23,9 24,1 23,7 0'
    IFS=' ' read -a tableau <<<"$var"
    temp_DJU="${tableau[@]:(-1)}"
    temp_ext="${tableau[0]}"
    temp_int_z1="${tableau[1]}"
     
    ((${#tableau[*]}>3)) && temp_int_z2="${tableau[2]}"
    ((${#tableau[*]}>4)) && temp_int_z3="${tableau[3]}"
    il serait sans doute plus intéressant de transformer temp_int en un tableau ...
    $moi= ( !== ) ? : ;

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    en voyant tous les awk, j'ai compris que le séparateur était la virgule, mais, pas du tout, c'est bien l'espace.
    ça ne change pas grand-chose : il suffit de retirer l'IFS du code.

    Citation Envoyé par papajoker
    il serait sans doute plus intéressant de transformer temp_int en un tableau ...
    le tableau existe déjà, enlevons-en "simplement" la (ou les) variable(s) extraites vers d'autres variables.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par musha76 Voir le message
    J'aimerai pouvoir compter le nombre de colonne que possède une variable afin de débloquer un script suivant le nombre de colonne.
    Je m'explique :

    Je récupère plusieurs valeurs (max 5) dans ma variable : $myvar, dont voici un exemple : 17,8 23,9 24,1 23,7 0

    J'aimerai connaitre le nombre de colonne que contient ce valeur afin de lui appliquer le script qui lui convient
    Veux-tu dire que, selon le nombre de valeurs (3, 4 ou 5), tu appelles un script différent avec 3, 4 ou 5 arguments?

    Amha, il vaudrait mieux avoir un seul script qui traite tous les cas et prenne en argument: un arg "ext", un arg "DJU" et un tableau de "temp_int_z", ou bien les arguments "temp_int_z1" "temp_int_z2" etc.

    N'est-ce pas possible?

    (Le jour où il y en aura 6, ce sera automatiquement pris en compte!)

    Sinon, pour compter le nb de "colonnes", N_BaH a donné la réponse nb=$(echo "$myvar" | awk '{print NF}').

    PS: généralement, il vaut mieux entourer les variables de guillemets.

  8. #8
    Membre régulier
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2014
    Messages
    135
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2014
    Messages : 135
    Points : 70
    Points
    70
    Par défaut
    Merci pour toutes ces réponses.

    Finalement je devais compter le nombre de ligne et non le nombre de colonne car le résultat affiche X valeurs sur 1 ligne mais on final se sont bien X valeurs sur X lignes... merci le debug

    Au final, je n'ai pas saisie l'objectif des tableaux donc je vais essayer d'être le plus compréhensible :

    Je me connecte à une base SQL via :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myvar=$(TDSVER=7.0 tsql -H **** -p **** -U **** -P **** < <(sed 's/@agence/'"$AGENCE"'/g' /tmp/temp_srv_energy.sql) |sed -n '/affected/{g;p};h')
    La variable myvar peut contenir jusqu'à 5 valeurs.

    Selon le nombre de valeurs récupéré, un script est lancé.

    En définitive, j'aimerai réaliser ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    if [ "$nb" -eq 5 ];then
            #Cas 5 valeurs
            #Affectation des variables
            temp_ext=$(echo $myvar | awk '{print $1}')
            temp_int_z1=$(echo $myvar | awk '{print $2}')
            temp_int_z2=$(echo $myvar | awk '{print $3}')
            temp_int_z3=$(echo $myvar | awk '{print $4}')
            temp_DJU=$(echo $myvar | awk '{print $5}')
     
            #Conditions
            if [ "$temp_ext" -ge "$CRIT_EXT" ] && [ "$temp_int_z1" -ge "$CRIT_INT1" ] &&  [ "$temp_int_z2" -ge "$CRIT_INT2"] &&  [ "$temp_int_z3" -ge "$CRIT_INT3"] && [ "$temp_DJU" -ge "$CRIT_DJU"];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; Intérieur Zone3 = "$temp_int_z3" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 Intérieur Zone3 (°C)=$temp_int_z3;$WARN_INT3;$CRIT_INT3;0;$MAX_INT3 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 2
            elif [ "$temp_ext" -ge "$WARN_EXT" ] && [ "$temp_ext" -lt "$CRIT_EXT" ] [ "$temp_int_z1" -ge "$WARN_INT1" ] && [ "$temp_int_z1" -lt "$CRIT_INT1" ] [ "$temp_int_z2" -ge "$WARN_INT2" ] && [ "$temp_int_z2" -lt "$CRIT_INT2" ] [ "$temp_int_z3" -ge "$WARN_INT3" ] && [ "$temp_int_z3" -lt "$CRIT_INT3" ] [ "$temp_DJU" -ge "$WARN_DJU" ] && [ "$temp_DJU" -lt "$CRIT_DJU" ];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; Intérieur Zone3 = "$temp_int_z3" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 Intérieur Zone3 (°C)=$temp_int_z3;$WARN_INT3;$CRIT_INT3;0;$MAX_INT3 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 1
            else
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; Intérieur Zone3 = "$temp_int_z3" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 Intérieur Zone3 (°C)=$temp_int_z3;$WARN_INT3;$CRIT_INT3;0;$MAX_INT3 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 0
            fi
     
    elif [ "$nb" -eq 4 ];then
            #Cas 4 valeurs
            #Affectation des variables
            temp_ext=$(echo $myvar | awk '{print $1}')
            temp_int_z1=$(echo $myvar | awk '{print $2}')
            temp_int_z2=$(echo $myvar | awk '{print $3}')
            temp_DJU=$(echo $myvar | awk '{print $4}')
     
            #Conditions
            if [ "$temp_ext" -ge "$CRIT_EXT" ] && [ "$temp_int_z1" -ge "$CRIT_INT1" ] &&  [ "$temp_int_z2" -ge "$CRIT_INT2"] && [ "$temp_DJU" -ge "$CRIT_DJU"];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 2
            elif [ "$temp_ext" -ge "$WARN_EXT" ] && [ "$temp_ext" -lt "$CRIT_EXT" ] [ "$temp_int_z1" -ge "$WARN_INT1" ] && [ "$temp_int_z1" -lt "$CRIT_INT1" ] [ "$temp_int_z2" -ge "$WARN_INT2" ] && [ "$temp_int_z2" -lt "$CRIT_INT2" ] [ "$temp_DJU" -ge "$WARN_DJU" ] && [ "$temp_DJU" -lt "$CRIT_DJU" ];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 1
            else
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C  ; Intérieur Zone2 = "$temp_int_z2" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 Intérieur Zone2 (°C)=$temp_int_z2;$WARN_INT2;$CRIT_INT2;0;$MAX_INT2 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 0
            fi
     
    else
            #Affectation des variables
            temp_ext=$(echo $myvar | awk '{print $1}')
            temp_int_z1=$(echo $myvar | awk '{print $2}')
            temp_DJU=$(echo $myvar | awk '{print $3}')
     
            #Conditions
            if [ "$temp_ext" -ge "$CRIT_EXT" ] && [ "$temp_int_z1" -ge "$CRIT_INT1" ] && [ "$temp_DJU" -ge "$CRIT_DJU"];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 2
            elif [ "$temp_ext" -ge "$WARN_EXT" ] && [ "$temp_ext" -lt "$CRIT_EXT" ] [ "$temp_int_z1" -ge "$WARN_INT1" ] && [ "$temp_int_z1" -lt "$CRIT_INT1" ] [ "$temp_DJU" -ge "$WARN_DJU" ] && [ "$temp_DJU" -lt "$CRIT_DJU" ];then
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 1
            else
                    echo "Extérieur = "$temp_ext" °C ; Intérieur Zone1 = "$temp_int_z1" °C ; DJU = "$temp_DJU" °C| Extérieur (°C)=$temp_ext;$WARN_EXT;$CRIT_EXT;0;$MAX_EXT Intérieur Zone1 (°C)=$temp_int_z1;$WARN_INT1;$CRIT_INT1;0;$MAX_INT1 DJU (°C)=$temp_DJU;$WARN_DJU;$CRIT_DJU;0;$MAX_DJU" && exit 0
            fi
    fi
    C'est assez usine à gaz, mais c'est ce que je recherche, après je ne sais pas si c'est la meilleure façon de procéder, n'y même si cela est fonctionnel

  9. #9
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 549
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    pour tenter d'apporter une solution robuste, je voudrais savoir comment sont définies les différentes variables CRIT_* et autres WARN_* ?

    * NB: les variables utilisateurs, pour ne pas risquer d'entrer en conflit avec les variables d'environnement, qui par convention, elles, sont tout en majuscules, doivent être en minuscules ou panachées.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Nombre de colonne dans une table
    Par dsr57 dans le forum Administration
    Réponses: 6
    Dernier message: 15/04/2009, 13h56
  2. connaitre le nombre de colonnes dans une feuille excel
    Par faten7 dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 17/06/2008, 08h56
  3. Nombre de colonnes dans une feuille de données
    Par steps5ive dans le forum Access
    Réponses: 2
    Dernier message: 09/01/2007, 21h52
  4. nom de colonne dans une variable
    Par cyclone_yas dans le forum SQL
    Réponses: 12
    Dernier message: 27/12/2006, 10h41
  5. Compter le nombre de colonne dans une table
    Par Coin dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/12/2006, 16h03

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo