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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    481
    Détails du profil
    Informations personnelles :
    Âge : 55
    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 : 41
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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!
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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 : 41
    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 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    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.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  6. #6
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    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 : 2 986
    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 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 288
    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

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, 11h18
  2. Mise au point d'une macro
    Par lenul78570 dans le forum Macros et VBA Excel
    Réponses: 11
    Dernier message: 15/12/2009, 15h05
  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, 17h41
  4. [Debutant] Mise au point d'une temporisation
    Par Slivo dans le forum Débuter
    Réponses: 5
    Dernier message: 25/04/2007, 00h18

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