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 :

[AWK] Mise au point d'une commande AWK/Bash pour réciupérer la taille dispo des montages Linux


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut [AWK] Mise au point d'une commande AWK/Bash pour réciupérer la taille dispo des montages Linux
    Bonjour,

    Je bloque sur la mise au point d'une commande AWK pour créer une commande Bash contenant du awk permettant de récupérer la taille des points de montage d'une machine et éventuellement de produire des erreurs si ça dépasse une seuil. Cela se comporte de manières différentes entre deux machines CentOS.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    df -m | awk 'BEGIN{total=0;utilise=0;dispo=0;nbr=0;FS=" "}
       NR>1 {nbr++;total+=$1;utilise+=$2;dispo+=$3}
       ((NR >1 && NR <FNR) && $4 >70 ) {print ("ALERTE : \t"$5"\t OCCUPE A : " $4)}
       END {print (" => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo")}'
    Basiquement au départ voici la commande que je souhaite intégrer dans un Bash. Toute remarque ou/et aide est la bienvenue.

    Par avance je vous remercies.

    Marco.

  2. #2
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Il y a un décalage de 1 au niveau des champs, une confusion au niveau du sens de NR et FNR, et une comparaison numérique où manque une conversion strtonum, qui ne peut manifestement pas se faire implicitement.
    Voici un correctif (j'ai également enlevé les initialisations inutiles, et la variable nbr inutilisée) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df -m | awk 'NR>1 {total+=$2; utilise+=$3; dispo+=$4} NR>1 && strtonum(substr($5,0,length($5)-1))>70 {print "ALERTE : \t"$6"\t OCCUPE A : " $5} END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}'

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 738
    Par défaut
    Bonjour,

    pourquoi répéter la condition NR>1 ?
    Code awk : Sélectionner tout - Visualiser dans une fenêtre à part
    NR>1{nbr++;total+=$1;utilise+=$2;dispo+=$3; sub("%","",$5); if ($5>70){print "alert"}
    strtonum(substr(...length(...)))
    KISS!

  4. #4
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Oui, c'est inutilement lourd, effectivement
    Mais par contre j'ai bien un souci avec la conversion :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ echo 8% | awk '{sub("%","",$1); if ($1>70){print "alert"}}'
    alert
    $
    alors que
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 8% | awk '{sub("%","",$1); if (strtonum($1)>70){print "alert"}}'
    $
    +++

    Il y a ça qui marcherait en l'occurrence, et qui pour le coup simplifie l'ensemble (et marche aussi en POSIX) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo 8% | awk 'int($1)>70 {print "alert"}'
    $

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 738
    Par défaut
    je n'avais pas testé, et oublié que les variables en awk sont toutes du texte à moins de ne contenir que des chiffres.

    oui, int() c'est bien.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    3 014
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 3 014
    Par défaut
    Tu peux faire une conversion implicite:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo 8% | awk '+$1>70 {print "alert"}'

  7. #7
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 306
    Par défaut
    Bonjour

    Toute remarque ou/et aide est la bienvenue.


    D'abord, je ne comprends pas l'intérêt de recréer "df" en moins bien.

    Ensuite, si tu comptes les tmpfs comme faisant partie de ton disque dur, tu vas vers un bel arrachage de cheveux. Cela pour dire que tout additionner n'est pas pertinent. La commande df est piégeuse.

    Enfin,
    Cela se comporte de manières différentes entre deux machines CentOS.
    L'explication est ci-dessus. Tu dois identifier les éléments qui constituent vraiment chacune des machines. Ou plutôt leurs disques durs.
    Exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    /dev/sda6
    /dev/sda7
    /dev/sda2

  8. #8
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Merci de toutes vos remarques toutes très constructives. Je ne savais pas que cette questions simple allait nous entraîner si loin.
    Je vais essayer de tester tout ça et voir si ça va. J'ai une machine sous CentOS 5.2 et une autre sous CentOS 7... La plus ancienne a l'ai de ne pas comprendre le "substr".

    Je cherche à me faire des commandes et éventuellement des idées de scripts, étant débutant en exploitation.

    C'était juste les informations que je souhaitais avoir et bien formatées à mon envie.

    Accessoirement, n'étant pas revenu depuis longtemps sur le forum, je ne trouvais plus lee boutton pour les balises "code". où se trouve t il s'il vous plaît ?

    Cordialement,
    Marco.

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 306
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 306
    Par défaut
    Bouton #. As-tu la bonne interface ? Il y en a plusieurs.

  10. #10
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Citation Envoyé par cotmar Voir le message
    J'ai une machine sous CentOS 5.2 et une autre sous CentOS 7... La plus ancienne a l'ai de ne pas comprendre le "substr".
    Le substr, il me semble qu'elle devrait, par contre le strtonum, c'est possible que non. Mais en intégrant les remarques qui suivent mon post #2, tu n'en as plus besoin :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df -m | awk 'NR>1{total+=$2; utilise+=$3; dispo+=$4; if (+$5>70){print "ALERTE : \t"$6"\t OCCUPE A : " $5}} END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}'

  11. #11
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Pour répondre à la question ci-dessus sur les boutons, je suis sur Firefox et en bas de l'écran, je vois : "0 1" à la place des pouces...


    Sinon, voici ce que je souhaite obtenir, sachant que la dernière ligne est mal formatée comme vous pouvez le constater :

    ALERTE : / OCCUPE A : 72%
    ...
    ALERTE : /var OCCUPE A : 91%
    ALERTE : 0% OCCUPE A : 1014
    => Taille totale du disque : 23286 Mo - Utilisee : 7074 Mo - dispo : 1422 Mo
    La dernière ligne me cause un souci car je ne comprends pas pourquoi il y a un décalage de colonne ?

    Par avance merci.

    Marco.

  12. #12
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Pour répondre à ma propre question, j'essaye une solution : enchaîner deux awk. Mais je sais que ça n'est certainement pas optimum au niveau des process et assez cradau d'un point de vue programmation.
    Ici j'élimine la dernière ligne qui m'embête, mais je ne suis pas certain que ça soit bien génial quand même.
    Quand je lance, j'ai le message d'erreur suivant :

    awk: Fatal: « » n'est pas un nom légal de variable

    Par avance merci.
    Marco.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
     
    Nb=$(df | awk 'END{print NR}')
    retour=$(df -m | awk -v = $Nb '
            NR>1 {total+=$2; utilise+=$3; dispo+=$4}
            NR>1 && $4>70 && NR<Nb {print "ALERTE : \t"$5"\t OCCUPE A : " $4}
            END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}')
     
    echo "$retour"
    exit 0
    NB : j'ai rajouté les balises à la main après les avoir récupéréées plus haut dans la discussion... Désolé.

  13. #13
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Tu peux filtrer la dernière ligne avant awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df -m | head -n-1 | awk 'NR>1{total+=$2; utilise+=$3; dispo+=$4; if (+$5>70){print "ALERTE : \t"$6"\t OCCUPE A : " $5}} END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}'

  14. #14
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 424
    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 424
    Par défaut
    Juste comme ça:
    Si tu as un décalage de champs, c'est que ton nombre de champs a changé, donc il suffirait de ne traiter que les lignes avec le bon nombre de champs...

    Sinon, peux-tu nous fournir une sortie de ta commande df -m, que l'on puisse comprendre la cause de ce décalage ?

    PS: si tu n'a pas le bouton [#] pour du rajout de code, la balise est (sans les espaces) : [ CODE ][ /CODE ]

  15. #15
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    Citation Envoyé par cotmar Voir le message
    awk: Fatal: « » n'est pas un nom légal de variable
    tu oublies de spécifier un nom de variable quand tu invoques awk : awk -vMo=$Nb '...

  16. #16
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Citation Envoyé par disedorgue Voir le message

    Juste comme ça:
    Si tu as un décalage de champs, c'est que ton nombre de champs a changé, donc il suffirait de ne traiter que les lignes avec le bon nombre de champs...

    Sinon, peux-tu nous fournir une sortie de ta commande df -m, que l'on puisse comprendre la cause de ce décalage ?
    Voici comment ça se présente (ci-dessous).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    #df -m
    Sys. de fich.        1M-blocs       Occupé Disponible Capacité Monté sur
    /dev/mapper/vg00-lvroot
                              2976      2011       812  72% /
    /dev/mapper/vg00-lvsup
                              5952      2820      2825  50% /supervision
    /dev/mapper/vg00-lvprojets
                             12896     10988      1243  90% /projets
    /dev/mapper/vg00-lvvar
                              5952      4799       846  86% /var
    /dev/mapper/vg00-lvadmin
                              3024      1222      1649  43% /admin
    /dev/sda1                   99        32        62  35% /boot
    tmpfs                     1014         0      1014   0% /dev/shm

    Par contre le "if" dans le AWK que vous m'avez présenté ne marche pas car il ne boucle pas et me présente toujours que le dernier élément sans faire d'itération.
    Du coup, j'ai gardé une solution plus ancienne

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     #df -m | head -n-1 | awk 'NR>1 {total+=$2; utilise+=$3; dispo+=$4} NR>1 &                                                               & $4>70 {printf "ALERTE : %10s OCCUPE A : %4d\n", $5, $4 }END{print " => Taille                                                                totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo "                                                                Mo"}'
    ALERTE :          / OCCUPE A :   72
    ALERTE :   /projets OCCUPE A :   90
    ALERTE :       /var OCCUPE A :   86
     => Taille totale du disque : 21939 Mo - Utilisee : 7407 Mo - dispo : 403 Mo

    Merci aussi pour cette réponse et un gros oups pour l'oubli... Désolé...

    tu oublies de spécifier un nom de variable quand tu invoques awk : awk -vMo=$Nb '...

  17. #17
    Membre émérite Avatar de balkany
    Homme Profil pro
    Touriste
    Inscrit en
    Juillet 2017
    Messages
    348
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Touriste

    Informations forums :
    Inscription : Juillet 2017
    Messages : 348
    Par défaut
    Tu as un problème d'affichage avec df : il faut que tu forces l'affichage à être POSIX. Pour cela, il faut utiliser l'option -P :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    df -Pm | awk 'NR>1{total+=$2; utilise+=$3; dispo+=$4; if (+$5>70){print "ALERTE : \t"$6"\t OCCUPE A : " $5}} END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}'

  18. #18
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 56
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 481
    Par défaut
    Bonjour,

    Désolé pour la lenteur de ma réponse. J'ai poursuivi en tenant compte de vos commentaires et j'ai intégré le résultat dans un shell :

    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
     
    # ! /bin/bash
    #
    #
     
    # Variables
    seuilerr=70             #Seuil d'erreur Ã*odifier (poucentage d'occupation du disque)
    seuilwarn=50    #Seuil de warning Ã*modifier (poucentage d'occupation du disque)
     
    machine=$(hostname)
     
    dfree=$(df -Pm | awk -v err=$seuilerr -v att=$seuilwarn '
                    NR>1 {total+=$2; utilise+=$3; dispo+=$4;
                            if (+$5>err){printf " => ALERTE  : %15s OCCUPE A : %4d% KO\n", $6, $5 }
                            else if (+$5>att){printf " => WARNING : %15s OCCUPE A : %4d% OK\n", $6, $5 }
                            else {printf " => NOTE    : %15s OCCUPE A : %4d% OK\n", $6, $5 }}
                    END{print " => Taille totale du disque : " total " Mo - Utilisee : " utilise " Mo - dispo : " dispo " Mo"}')
     
    # Programme principal
     
    echo "###################"
    echo "Nom de la machine : " . $machine
    echo "###################"
    echo "$dfree "
     
    # Fin
    exit 0
    A présent, comment faire soit pour envoyer le résultat via un SCP, soit pour envoyer par email ?

    Cordialement,
    Marc.

Discussions similaires

  1. Cherche une commande shell/bash pour traitement sur fichier
    Par breizho35 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 26/02/2015, 12h18
  2. Mise au point d'une macro
    Par lenul78570 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/12/2009, 16h05
  3. Probème sur la mise au point d'une requête
    Par Emmanuel Deloget dans le forum Langage SQL
    Réponses: 4
    Dernier message: 25/01/2008, 18h41
  4. [Debutant] Mise au point d'une temporisation
    Par Slivo dans le forum Débuter
    Réponses: 5
    Dernier message: 25/04/2007, 01h18

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