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 :

Récupération de la valeur d'un cut


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut Récupération de la valeur d'un cut
    Bonjour,
    En combinant la commande df . Et cut j'obtiens le remplissage du user group quotas en poucentage.
    90% par exmple.
    J'aimerais dans un shell récupérer cette valeur, la tester, et envoeyr un code retour différent de 0 si cette valeut dépasse 80%.

    C'est surtout la partie récupération du résultat de la commande cut qui me bloque...

  2. #2
    Expert éminent sénior Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    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 : 5 196
    Points : 12 264
    Points
    12 264
    Par défaut
    non tu ne bloque pas cut est précisément fait pour ça ... cut -d '%' -f1
    te donne to 90 sans '%'

    par contre là c'est inesthétique c'est
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...... | cut.....| cut ....
    là c'est donc mieux de faire un sed ou un un awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    francois@h2g2:~$ echo sdcd  cd csd 14%  cdsc sddc d | sed 's/.*\([0-9][0-9]\)%.*/\1/'
    14

    dans un script bash ça deviendrai
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    if [ $(commande | sed ........................................) -gt 80 ] ; then
          alerte
    else
          ok
    fi

  3. #3
    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,

    cf.
    man bash / substitution de commandes
    help testen sachant que tu dois conserver uniquement la valeur numérique de la donnée.
    n'y a-t-il que des valeurs entières ?

    renvoyer un code retour
    code retour du script, ou d'une fonction du script, ou uniquement du test ?
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  4. #4
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    sam01, j'aurais été intéressé de savoir comment tu récupères le pourcentage d'utilisation avec cut.

    Moi, je te propose d'utiliser awk.
    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
     
    #!/bin/sh
     
    THRESHOLD=90
     
    rc=0
    for usepc in $(df | sed -e '1d' |
        awk '{ usepc = $5;
            gsub("%", "", usepc);
            print usepc }')
    do
        if [ $usepc -gt $THRESHOLD ]
        then
            rc=1
            echo "ALERT!"
        fi
    done
    exit $rc
    Par contre, pour enlever la 1ère ligne (c'est la description des champs renvoyés par df) je n'ai pas réussi à le faire avec awk d'où le sed pipé sur awk qui n'est pas très élégant.

    Comment faire pour supprimer cette 1ère ligne à l'intérieur de mon awk ?

    @N_BaH : Dans ma Debian Jessie, df ne renvoie que des nombres entiers.
    IMHO, you should RTFM ASAP. IHTH.

  5. #5
    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
    Comment faire pour supprimer cette 1ère ligne à l'intérieur de mon awk ?
    tu testes si NR vaut 1 ou pas.

    mais pourquoi ne pas parser df directement avec awk ?

    de toute manière, je trouve le cahier des charges un peu léger...
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Si je veux éviter sed, je n'ai trouvé que ça :
    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
     
    #!/bin/sh
     
    THRESHOLD=10
     
    LANG=C
    rc=0
    for usepc in $(df |
        awk ' $5 !~ "Use%" { usepc = $5;
                             gsub("%", "", usepc);
                             print usepc }')
    do
        if [ $usepc -gt $THRESHOLD ]
        then
            rc=1
            echo "ALERT!"
        fi
    done
    exit $rc
    IMHO, you should RTFM ASAP. IHTH.

  7. #7
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    df | awk 'NR>1{sub("%","",$5);print $5}'
    quand je disais « pourquoi ne pas parser df directement à awk », je pensais pourquoi ne pas tout faire en awk.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Bonjour à tous et désolé pour le retard.
    Voilà ce que me donne la commande df .

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    Filesystem    512-blocks      Free %Used    Iused %Iused Mounted on
    /dev/hd1           65536     63880    3%      102     2% /home/Grp1
    effectivement avec le cut je n'ai pas réussi.
    Voici mon cut :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
     
    df .|cut -d" " -f4
    mais c'est le blanc derrière le d qui ne plaît pas à la commande.

    Par contre ta commande @N_BaH focntionne à merveille.

    Mais je l'ai modifiée car c'est le 4ème champ qui m'intéresse et non le cinquième (le pourcentage utilisé).

    Ce qui me donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    df .|awk 'NR>1{sub("%","",$4);print $4}'
    j'obtiens bien la valeur 3.

    Maintenant si je le combine avec le script de RaphaelG j'obtiendrai ce que je veux ;)

    Merci à vous tous.

  9. #9
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df | awk 'NR>1{sub("%","",$5);print $5}'
    quand je disais « pourquoi ne pas parser df directement à awk », je pensais pourquoi ne pas tout faire en awk.
    Parce que :

    1) Pour l'utilisateur, c'est moins pratique à utiliser. Il faut qu'il se souvienne que le script parse le réslutat de la commande df. Il a 5 caractères à taper en plus.
    Avec un shell script : $ ./nomduscript.sh
    Avec un awk script : $ df | ./nomduscript.awk

    2) Je suis une bille et j'y arrive pas. Voilà ce que j'ai essayé de faire :
    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
     
    brouillons$ df
    Filesystem     1K-blocks    Used Available Use% Mounted on
    /dev/sda2       41200952 3970096  35114864  11% /
    udev               10240       0     10240   0% /dev
    tmpfs             756536    9272    747264   2% /run
    tmpfs            1891332     224   1891108   1% /dev/shm
    tmpfs               5120       4      5116   1% /run/lock
    tmpfs            1891332       0   1891332   0% /sys/fs/cgroup
    /dev/sda5        8134860 1092468   6606120  15% /var
    /dev/sda1         486628   32828    424156   8% /boot
    /dev/sda6      425871672  935888 403279720   1% /home
    tmpfs             378268       8    378260   1% /run/user/118
    tmpfs             378268      12    378256   1% /run/user/1000
    brouillons$ cat alertdf.awk
    #!/usr/bin/awk -f
     
    BEGIN {
        THRESHOLD = 79
        rc = 0
    }
     
    NR > 1 { 
        sub("%", "", $5)
        if ( $5 > THRESHOLD ) {
           rc = 1
           print $5 " ALERT! " THRESHOLD
        }
    }
     
    END { exit rc }
    brouillons$ df | ./alertdf.awk
    8 ALERT! 79
    brouillons$ echo $?
    1
    brouillons$
    J'aimerais bien comprendre pourquoi ça déclenche à 8% alors que le seuil est à 79%.
    J'ai essayé avec pluiseurs valeurs de seuil (variable THRESHOLD) et les résultats sont variés mais pas logiques (pour mon entendement).
    IMHO, you should RTFM ASAP. IHTH.

  10. #10
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Voici mon script d'alerte :

    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
     
    #!/bin/sh
     
    # on pose la limite du quota pour emettre un warning
     
    THRESHOLD=80
     
    rc=0
    cd /PROD
    QUOTA=$(df .|awk 'NR>1{sub("%","",$4);print $4}')
          if [ $QUOTA -gt $THRESHOLD ]
    		then
    			rc=1
    			echo "ALERT! Le user quota atteint les 80%"
    		else
    			echo "le remplissage du quota est à "$QUOTA"%"
    	fi
     
    exit $rc
    Merci encore pour votre aide.

  11. #11
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Content si j'ai pu t'aider.
    Une petite remarque histoire de pinailler un peu : je pense qu'il vaut mieux ne pas faire un Change Directory dans un script.
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cd /PROD
    QUOTA=$(df .|awk 'NR>1{sub("%","",$4);print $4}')
    Je ferai plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QUOTA=$(df /PROD | awk 'NR>1{sub("%","",$4);print $4}')
    Si c'est pas trop indiscret, un OS avec des disques s'appelant hdxx et un df qui affiche moins de colonnes que les Linux, ne serait ce pas de l'AIX ?
    IMHO, you should RTFM ASAP. IHTH.

  12. #12
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    En bash sous linux (pour le fun) :
    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
    #!/bin/bash
     
    # on pose la limite du quota pour emettre un warning
     
    THRESHOLD=80
     
    QUOTA=$(($(stat -f --printf="((%b-%f)*100)/(%b-%f+%a)" ./PROD)))
    rc=0
          if [[ $QUOTA -gt $THRESHOLD ]]
    		then
    			rc=1
    			echo "ALERT! Le user quota atteint les 80%"
    		else
    			echo "le remplissage du quota est à "$QUOTA"%"
    	fi
     
    exit $rc
    Ici, on est à l'arrondi inférieur alors que df fait un arrondi supérieur...
    Cordialement.

  13. #13
    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
    par défaut, les variables awk sont de type texte.

    mais pourquoi la chaîne 8 est-elle "supérieure" à 79 ???
    je ne m'y ferai pas, je crois.
    en shell aussi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     test 8 \> 79 && echo ok || echo ko
    ok
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if ( $5 /1 > THRESHOLD ) { #ici, $5 subissant une opération devient un nombre.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Membre habitué Avatar de RaphaelG
    Homme Profil pro
    Amateur
    Inscrit en
    Juin 2016
    Messages
    94
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Amateur

    Informations forums :
    Inscription : Juin 2016
    Messages : 94
    Points : 183
    Points
    183
    Par défaut
    Total respect, N_BaH !
    Donc, mon awk script, maintenant est le suivant :
    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
    #!/usr/bin/awk -f
     
    BEGIN {
        THRESHOLD = 80
        rc = 0
    }
     
    NR > 1 { 
        sub("%", "", $5)
        if ( $5 /1 > THRESHOLD ) {
           rc = 1
           print "ALERT! " $6
        }
    }
     
    END { exit rc }
    Et ça marche !
    IMHO, you should RTFM ASAP. IHTH.

  15. #15
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    26 859
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 26 859
    Points : 218 580
    Points
    218 580
    Billets dans le blog
    120
    Par défaut
    Bonjour,
    Citation Envoyé par N_BaH Voir le message
    par défaut, les variables awk sont de type texte.

    mais pourquoi la chaîne 8 est-elle "supérieure" à 79 ???
    En comparaison de chaines de caractères, le '8' > '7' (voir code ASCII). De plus la comparaison s'arrête à la première différence. Du coup, la résultat c'est, toute chaîne commençant par '8' et supérieur à toute chaîne commençant par '7' (et '6' et '5'...)
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  16. #16
    Membre averti
    Inscrit en
    Mars 2004
    Messages
    1 907
    Détails du profil
    Informations forums :
    Inscription : Mars 2004
    Messages : 1 907
    Points : 411
    Points
    411
    Par défaut
    Citation Envoyé par RaphaelG Voir le message
    Content si j'ai pu t'aider.
    Une petite remarque histoire de pinailler un peu : je pense qu'il vaut mieux ne pas faire un Change Directory dans un script.
    Au lieu de :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    cd /PROD
    QUOTA=$(df .|awk 'NR>1{sub("%","",$4);print $4}')
    Je ferai plutôt :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    QUOTA=$(df /PROD | awk 'NR>1{sub("%","",$4);print $4}')
    Si c'est pas trop indiscret, un OS avec des disques s'appelant hdxx et un df qui affiche moins de colonnes que les Linux, ne serait ce pas de l'AIX ?
    Salut tu as bien deviné, là j'étais bien sur de l'AIX mais j'ai testé sur du linux et ça fonctionne pareil.
    Merci pour ton conseil sur le cd :-)

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