Comment imprimer le pourcentage d'utilisation du disque à partir de `df -hl`

12

Je sais que df -hlgénère une liste de toutes mes partitions avec sa taille, son utilisation en pourcentage et l'espace disponible.

Si je voulais afficher uniquement la taille et l'utilisation en pourcentage sda2et sda3, par exemple, comment pourrais-je dire à Linux (Ubuntu) de les vérifier, de les additionner et de me les montrer?

user32398
la source
1
Les réponses ci-dessous pourraient être simplifiées en modifiant la commande df qu'ils utilisent pour placer les disques sur la ligne de commande df au lieu d'analyser tous les disques. ie df -hl / dev / sda [23]
mdpc

Réponses:

11

Pour dfcalculer les totaux, utilisez l' --totalsoption. Si vous ne souhaitez que les totaux sur certains lecteurs sélectionnés, spécifiez-les comme arguments.

Exemples (et sortie de mon ordinateur)

C'est le total pour toutes les montures locales:

$ df --total -hl
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
none                  490M  660K  489M   1% /dev
none                  497M  1,5M  495M   1% /dev/shm
none                  497M  260K  496M   1% /var/run
none                  497M     0  497M   0% /var/lock
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  19G   12G  7,3G  62%

Restreindre à quelques lecteurs (notez que si le chemin spécifié n'est pas un point de montage exact, le point de montage contenant le plus proche est utilisé [voir note à la fin] ):

$ df -hl --total /home /fastdisk
Filesystem            Size  Used Avail Use% Mounted on
/dev/sdb1              14G   12G  2,1G  85% /
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
total                  17G   12G  5,3G  69%

ou en utilisant des devnoms:

$ df -hl --total /dev/sda1 /dev/sdb1
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             3,7G  418M  3,3G  12% /fastdisk
/dev/sdb1              14G   12G  2,1G  85% /
total                  17G   12G  5,3G  69%

Personnalisation supplémentaire

Si vous souhaitez répertorier tous les montages à l'exception des montages «spéciaux», vous pouvez utiliser l' -xoption pour exclure par type de partition. (Utilisez l' -Toption pour afficher les types.)

Personnellement, pour une utilisation interactive, j'utilise l'alias bash suivant (ajouté à ~/.bash_aliases) pour exclure les montages «non physiques».

alias df='df -h -x devtmpfs -x tmpfs -x debugfs'

Remarque

La spécification de chemins dans les points de montage peut parfois donner des résultats sous une forme différente en spécifiant le chemin exact vers le point de montage. Par exemple, sur mon ordinateur portable, j'utilise sshfspour monter mon serveur de fichiers (local).

df -h ~/.server-root/ ~/.server-root/disks/A ~/.server-root/disks/B
Filesystem            Size  Used Avail Use% Mounted on
johan@server:/        185G   58G  118G  33% /home/johan/.server-root
johan@server:/        1,9T  637G  1,2T  35% /home/johan/.server-root
johan@server:/        1,8T  1,1T  757G  59% /home/johan/.server-root

La racine du serveur ( /) est montée sur ~/.server-root. Cependant, sur le serveur, des disques sont montés sur /disks/*lesquels df(sur l'ordinateur portable) ne «savent» pas.

Évidemment, dfpeut répertorier l'utilisation du disque sur les différents supports du serveur, si les chemins d'accès appropriés leur sont fournis. Cependant, il montre le même «système de fichiers» et «monté sur» pour tous les chemins, car (je crois) c'est le seul point de montage (relatif à ce sshfsmontage) dans la table de montage du noyau local.


Autre chose: pas vraiment lié à la question, mais lié à une réponse précédente à la question.

Additionner les nombres avec un awkscript (ou similaire), comme le font certaines réponses précédemment publiées, n'est pas une bonne idée lors de l'utilisation du -hdrapeau. En effet, une manipulation spéciale est requise. Vous ne pouvez pas simplement faire size+=$2;pour un champ qui est 418Msur une ligne et 12Gsur une autre et en tirer quelque chose d'utile…

Pour un exemple avec awk, ajouter 500Maux 10.2Grendements

$ echo -e '500M\n10.2G' | awk '{size+=$1;} END{print size;}'
510.2

510.2 de quoi?

Il y a clairement un problème ici. Donc, juste comme astuce à retenir , lorsque vous effectuez un calcul (automatisé) sur la sortie de df (et d'autres qui peuvent utiliser des nombres «lisibles par l'homme» ) . Assurez-vous que vous n'utilisez pas l' -hindicateur et que l'entrée du script de calcul est, à la place, normalisée (par exemple en octets, blocs, Ko ou autres) et effectuez la mise à l' échelle de l'affichage à la fin. Il n'est pas trop difficile, dans la plupart des langages de script et de programmation, d'ajouter quelque chose comme:

If value < threshold Then
  print (value),"B"
Else If value < 1024*threshold Then
  print (value/1024),"kB"
Else If value < 1024*1024*threshold Then
  print (value/1024/1024),"MB"
(and so on...)

où la valeur est en octets et le seuil est une valeur de l'ordre de 1000. Le résultat de cette méthode est que vous pouvez facilement la régler pour produire des valeurs imprimées (à l'exclusion du préfixe) dans une plage souhaitée et avec un nombre de chiffres significatifs pour votre choisir. Par rapport au cas des utilitaires standard avec -hcommutateurs, où le format est souvent fixe.

Bien sûr, ce calcul peut souvent être rendu plus efficace et / ou élégant, mais c'est une question pour la langue spécifique dans laquelle il est écrit. Franchement, s'il est utilisé dans un script utilisateur qui n'est exécuté que de temps en temps pour afficher de manière interactive certaines informations, l'efficacité n'est pas vraiment une préoccupation.

Johan E
la source
4

Je pense que vous vouliez la somme des deux sizeetuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t
pradeepchhetri
la source
Idem, la même chose que ci-dessus.
user32398
@ user32398: Il y a des différences mec.
pradeepchhetri
À la fin de ma réponse à cette question, j'ai développé un peu pourquoi ne pas utiliser (simplement size+=$1) une approche awk simpliste à cette question. Cette méthode n'est vraiment pas compatible avec l' -hoption de df.
Johan E
2

Vous utiliseriez un outil comme awk:

df -hl | awk '/^\/dev\/sd[ab]/ { sum+=$5 } END { print sum }'

Où:

  • /^\/dev\/sd[ab]/est un modèle pour filtrer uniquement les lignes commençant par /dev/sdaou/dev/sdb
  • { sum+=$5 } ajouter le cinquième champ pour toutes les correspondances du modèle ci-dessus

Vous pouvez trouver des awkréférences utiles sur le wiki Awk.info .

jasonwryan
la source
Je pense que ce n'est pas assez pour additionner le%, mais merci j'ai l'idée.
user32398
1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'
sandeep
la source
1
Il a demandé size, % usedet available. Pas seulement% utilisé. @Mdpc a également une meilleure méthode pour distinguer le lecteur, mais si vous voulez faire correspondre le modèle à awk, vous pouvez le faire: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b
0

Si vous le vouliez avec des alertes, je le fais avec IFTTT, Telegram And WebHooks (qui est tout gratuit)

#!/bin/bash
diskusage=$(df -H | grep -vE '^Filesystem|tmpfs|cdrom|mmcblk0p1' | awk '{ print $5 " " $1 }'| cut -f1 -d '%')
hostname=$(hostname)
tolerance=(85)
date=$(date)

if [[ "$diskusage" -gt "$tolerance" ]]
        then
        echo ""
        echo total disk usage is $diskusage%
        echo ""
        curl -X POST -H "Content-Type: application/json" -d '{"value1":"--Alert--","value2":"Total disk usage is '$diskusage'% ","value3":"Host information: '$hostname' "}' https://maker.ifttt.com/trigger/{alert}/with/key/PutYourKeyHEre
fi
echo ''
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date
echo Disk usage is $diskusage%. The tolerance is $tolerance%. No alert fired $date >> /var/log/IFTTT/checkdiskspace.log
pooley999
la source