¿Cómo capturar el porcentaje de uso del disco de una partición como un entero?

16

Me gustaría un método para capturar el uso del disco de una partición particular, utilizando el directorio donde está montada la partición. La salida debería ser un número entero sin relleno o símbolos siguientes, ya que me gustaría guardarlo en una variable.

Lo he usado df --output=pcent /mount/point, pero necesito recortar la salida ya que tiene un encabezado innecesario, un espacio de relleno único antes del valor y un símbolo% que sigue el valor de esta manera:

Use%
 83%

En este caso, la salida que me gustaría sería simplemente 83. No conozco ningún inconveniente en el uso de la salida de df, pero estoy feliz de aceptar otros métodos que no dependen de él.

Arronico
fuente
1
¿por qué no simplemente analizarlo?
Jacob Vlijm
1
Tampoco veo un inconveniente, puede eliminar el encabezado con df y luego | tr -dc '0-9'
Estoy corregido, no puedo encontrar el interruptor para eliminar el encabezado de df.
Había leído la página de manual, y la página de información y tampoco podía encontrarla @ bc2946088, un buen grito para considerar tr, me estaba metiendo la cabeza en un lío con ideas sed y awk.
Arronico
3
También he buscado eliminar la opción de encabezado. Básicamente, los desarrolladores de GNU son reacios a implementarlo. Ha habido solicitudes de funciones, y simplemente dijeron que no.
Sergiy Kolodyazhnyy

Respuestas:

19

Yo usaría ...

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

No estoy seguro si sed es más rápido, pero no puedo recordar los valores de sed.

muru
fuente
1
Usando timepara probar sale tan rápido como sed.
Arronico
44
@Arronical a menos que sus resultados sean waaaaaaaaaaaay más del 100%, dudo que vea mucha diferencia. : P
muru
@Arronical Lo que muru dijo; Es probable que domine el tiempo de invocación.
un CVn
1
En este caso, tres más fácil de leer que sed.
Paddy Landau
7

Aquí hay una solución awk:

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

Básicamente, lo que sucede aquí es que tratamos el carácter '%' como separador de campo (delimitador de columna) e imprimimos la primera columna $ 1 solo cuando el número de registros es igual a dos (el NR==2 parte)

Si quisiéramos usar solo bashherramientas, podríamos hacer algo como esto:

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

Y por diversión, alternativa a sedtravés del grupo de captura y -rpara expresiones regulares extendidas:

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

sed solución

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d eliminar la primera línea
  • ; para separar comandos
  • s/^ // eliminar un espacio desde el inicio de las líneas
  • s/%//eliminar %signo
Zanna
fuente
6

Puede canalizar a un grepque solo extraiga dígitos:

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

Véalo en vivo:

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

Encontré un servidor donde --output = pcent aún no estaba implementado, así que utilicé la salida normal, filtrada por columna, seguida de la expresión regular: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
fuente
1
Debe agregar -P o --portability a df; de lo contrario, si el punto / mount / es demasiado largo, se saltará una línea y obtendrá el valor incorrecto.
SvennD
1

Solución de dos pasos Bash

Al ser un fanático de bash (Borne Again SHell) el año pasado, pensé en proponer una solución para usarlo.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • La línea 1 captura la dfsalida a variable DF_PCT.
  • La línea 2 elimina todo lo que no es un dígito DF_PCTy lo muestra en la pantalla.
  • Ventaja sobre respuesta aceptada es avance de línea después porcentaje ( 5en este caso) se genera.
WinEunuuchs2Unix
fuente
1

Aquí hay otra solución:

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