Comment capturer le pourcentage d'utilisation du disque d'une partition sous forme d'entier?

16

Je voudrais une méthode pour capturer l'utilisation du disque d'une partition particulière, en utilisant le répertoire où la partition est montée. La sortie doit simplement être un entier sans remplissage ni symboles suivants, comme je voudrais l'enregistrer dans une variable.

J'ai utilisé df --output=pcent /mount/point, mais je dois couper la sortie car elle a un en-tête inutile, un espace unique avant la valeur et un symbole% suivant la valeur comme ceci:

Use%
 83%

Dans ce cas, la sortie que j'aimerais serait tout simplement 83. Je ne connais aucun inconvénient à utiliser la sortie de df, mais je suis heureux d'accepter d'autres méthodes qui n'y reposent pas.

Arronical
la source
1
pourquoi ne pas simplement l'analyser?
Jacob Vlijm
1
Je ne vois pas non plus d'inconvénient, vous pouvez supprimer l'en-tête avec df puis | tr -dc '0-9'
Je me tiens corrigé, je ne trouve pas le commutateur pour supprimer l'en-tête de df.
J'avais lu la page de manuel et la page d'informations et je ne pouvais pas la trouver non plus @ bc2946088, bon cri à considérer tr, je me mettais la tête dans le pétrin avec des idées sed et awk.
Arronical
3
J'ai également cherché à supprimer l'option d'en-tête. Fondamentalement, les développeurs GNU hésitent à l'implémenter. Il y a eu des demandes de fonctionnalités et ils ont simplement dit non.
Sergiy Kolodyazhnyy

Réponses:

19

J'utiliserais ...

df --output=pcent /mount/point | tr -dc '0-9'

Je ne sais pas si sed est plus rapide, mais je ne me souviens jamais des valeurs de sed.

muru
la source
1
Utilisé timepour le tester, il est aussi rapide que sed.
Arronical
4
@Arronical, sauf si vos sorties sont supérieures à 100% waaaaaaaaaaaay, je doute que vous verriez beaucoup de différence. : P
muru
@Arronical Ce que muru a dit; le temps d'invocation est susceptible de dominer.
un CVn
1
Dans ce cas, trest plus facile à lire que sed.
Paddy Landau
7

Voici une solution awk:

$ df --output=pcent /mnt/HDD | awk -F'%' 'NR==2{print $1}'   
 37

Fondamentalement, ce qui se passe ici est que nous traitons le caractère '%' comme séparateur de champ (délimiteur de colonne) et n'imprimons la première colonne $ 1 que lorsque le nombre d'enregistrements est égal à deux (la NR==2partie)

Si nous voulions utiliser des bashoutils uniquement, nous pourrions faire quelque chose comme ceci:

bash-4.3$ df --output=pcent / | while IFS= read -r line; do 
>     ((c++)); 
>     [ $c -eq 2 ] && echo "${line%\%*}" ;
> done
 74

Et pour le plaisir, alternative sedvia le groupe de capture et -rpour l'expression régulière étendue:

df --output=pcent | sed -nr '/[[:digit:]]/{s/[[:space:]]+([[:digit:]]+)%/\1/;p}'
Sergiy Kolodyazhnyy
la source
6

sed Solution

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d supprimer la première ligne
  • ; pour séparer les commandes
  • s/^ // supprimer un espace au début des lignes
  • s/%//supprimer le %signe
Zanna
la source
6

Vous pouvez diriger vers un grepqui extrait simplement les chiffres:

df --output=pcent /mount/point | grep -o '[0-9]*'

Voir en direct:

$ echo "Use%
> 83%" | grep -o '[0-9]*'
83
fedorqui
la source
1

Je suis tombé sur un serveur où --output = pcent n'était pas encore implémenté, j'ai donc utilisé la sortie normale, filtrée par colonne, suivie de l'expression régulière: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
la source
1
Vous devez ajouter -P ou --portability à df; sinon, si le point / mount / est trop long, la ligne sera interrompue et vous obtiendrez la mauvaise valeur.
SvennD
1

Solution Bash en deux étapes

Étant un peu un fan de bash (Borne Again SHell) l'année dernière, j'ai pensé proposer une solution en l'utilisant.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • La ligne 1 capture la dfsortie en variable DF_PCT.
  • La ligne 2 supprime tout ce qui n'est pas un chiffre DF_PCTet l'affiche à l'écran.
  • L'avantage par rapport à la réponse acceptée est le saut de ligne après la 5génération du pourcentage ( dans ce cas).
WinEunuuchs2Unix
la source
1

Voici une autre solution:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Feriman
la source