Come acquisire la percentuale di utilizzo del disco di una partizione come numero intero?


16

Vorrei un metodo per catturare l'utilizzo del disco di una partizione particolare, usando la directory in cui è montata la partizione. L'output dovrebbe essere solo un numero intero senza riempimento o simboli seguenti, poiché vorrei salvarlo in una variabile.

Ho usato df --output=pcent /mount/point, ma ho bisogno di tagliare l'output in quanto ha un'intestazione non necessaria, una spaziatura singola prima del valore e un simbolo% che segue il valore in questo modo:

Use%
 83%

In questo caso l'uscita che vorrei sarebbe semplicemente 83. Non sono a conoscenza di alcun inconveniente nell'uso dell'output di df, ma sono felice di accettare altri metodi che non si basano su di esso.


1
perché non semplicemente analizzarlo?
Jacob Vlijm,

1
Non vedo neanche uno svantaggio, puoi rimuovere l'intestazione con df quindi | tr -dc '0-9'

Sono corretto, non riesco a trovare l'interruttore per rimuovere l'intestazione da df.

Leggevo la pagina man e la pagina info e non riuscivo nemmeno a trovarla @ bc2946088, un bel grido da considerare tr, mi stavo mettendo la testa in disordine con le idee sed e awk.
Arronical

3
Ho cercato anche la rimozione dell'opzione di intestazione. Fondamentalmente gli sviluppatori GNU sono riluttanti a implementarlo. Ci sono state richieste di funzionalità e hanno appena detto di no.
Sergiy Kolodyazhnyy,

Risposte:


19

Userei ...

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

Non sono sicuro se sed sia più veloce, ma non riesco mai a ricordare i valori di sed.


1
Usarlo timeper testarlo risulta essere veloce quanto sed.
Arronical

4
@Arronical, a meno che le tue uscite non siano waaaaaaaaaaaay superiori al 100%, dubito che vedresti molte differenze. : P
muru,

@Arronical Cosa ha detto Muru; è probabile che il tempo di invocazione preveda.
un CVn

1
In questo caso, trè più facile da leggere di sed.
Paddy Landau,

7

Ecco la soluzione awk:

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

Fondamentalmente ciò che accade qui è che trattiamo il carattere '%' come separatore di campo (delimitatore di colonna) e stampiamo la prima colonna $ 1 solo quando il numero di record è uguale a due (la NR==2parte)

Se volessimo usare bashsolo strumenti, potremmo fare qualcosa del genere:

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

E per divertimento, alternativa sedtramite il gruppo di acquisizione e -rper regex esteso:

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

6

sed soluzione

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d elimina la prima riga
  • ; per separare i comandi
  • s/^ // rimuove uno spazio dall'inizio delle linee
  • s/%//rimuovi %segno

6

Puoi reindirizzare a un grepche estrae solo cifre:

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

Guardalo dal vivo:

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

1

Mi sono imbattuto in un server in cui --output = pcent non era ancora implementato, quindi ho usato l'output normale, filtrato per colonna, seguito dal regex: df /mount/point | awk '{print $5}' | tr -dc '0-9'


1
Dovresti aggiungere -P o --portability a df; altrimenti se il punto / mount / è troppo lungo, si interromperà la linea e otterrai il valore sbagliato.
SvennD,

1

Bash soluzione in due passaggi

Essendo un po 'un fan di Bash (Borne Again SHell) l'anno scorso, ho pensato di proporre una soluzione per usarlo.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • La riga 1 cattura l' dfoutput su variabile DF_PCT.
  • La riga 2 rimuove tutto ciò che non è una cifra DF_PCTe la visualizza sullo schermo.
  • Il vantaggio rispetto alla risposta accettata è il feed di riga dopo la 5generazione della percentuale ( in questo caso).

1

Ecco un'altra soluzione:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.