Cómo imprimir el porcentaje de uso del disco desde `df -hl`

12

Sé que df -hlgenera una lista de todas mis particiones con su tamaño, uso como porcentaje y espacio disponible.

Si quisiera generar solo el tamaño y el uso como un porcentaje de sda2y sda3, por ejemplo, ¿cómo podría decirle a Linux (Ubuntu) que los verifique, los sume y me los muestre?

user32398
fuente
1
Las respuestas a continuación podrían simplificarse cambiando el comando df que usan para colocar los discos en la línea de comando df en lugar de analizar todos los discos. es decir, df -hl / dev / sda [23]
mdpc

Respuestas:

11

Para dfcalcular totales, use la --totalsopción. Si desea los totales solo en algunas unidades seleccionadas, especifíquelas como argumentos.

Ejemplos (y salida de mi computadora)

Este es el total de todas las monturas 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%

Restringir a algunas unidades (tenga en cuenta que si la ruta especificada no es un punto de montaje exacto, se utiliza el punto de montaje que contiene más cercano [ver nota al final] ):

$ 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%

o usando devnombres:

$ 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%

Personalización adicional

Si desea enumerar todos los montajes, excepto los 'especiales', puede usar la -xopción para excluir por tipo de partición. (Use la -Topción para mostrar los tipos).

Personalmente, para uso interactivo, utilizo el siguiente alias bash (agregado a ~/.bash_aliases) para excluir los montajes 'no físicos'.

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

Nota

La especificación de rutas dentro de los puntos de montaje a veces puede generar resultados de forma diferente, especificando la ruta exacta al punto de montaje. Por ejemplo, en mi computadora portátil uso sshfspara montar mi servidor de archivos (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

El servidor raíz ( /) está montado en ~/.server-root. Sin embargo, en el servidor, los discos están montados /disks/*, lo que df(en la computadora portátil) no 'conoce'.

Evidentemente, dfpuede enumerar el uso del disco en los diferentes montajes en el servidor, si se le dan las rutas adecuadas. Sin embargo, muestra el mismo "Sistema de archivos" y "Montado en" para todas las rutas, ya que (creo) ese es el único punto de montaje (relacionado con este sshfsmontaje) en la tabla de montaje del núcleo local.


Otra cosa: no está realmente relacionado con la pregunta, sino con una respuesta previa a la pregunta.

Sumar los números con un awkguión (o similar), como hacen algunas respuestas publicadas anteriormente, no es una buena idea cuando se usa la -hbandera. Esto se debe a que se requiere un manejo especial. No puede simplemente hacer size+=$2;un campo que está 418Men una fila y 12Gen otra y obtener algo útil de él ...

Por ejemplo con awk, sumando 500Ma 10.2Grendimientos

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

510.2 de qué?

Claramente hay un problema aquí. Entonces, solo como un consejo para recordar , al hacer un cálculo (automatizado) en la salida de df (y otros que pueden usar números 'legibles por humanos' ) . Asegúrese de no utilizar el -hindicador y de que la entrada al script de cálculo esté, en cambio, normalizada (por ejemplo, a bytes, bloques, KB o lo que sea) y realice la 'escala de visualización' al final. No es difícil, en la mayoría de los lenguajes de programación y scripting, agregar algo como:

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...)

donde el valor está en bytes y el umbral es un valor del orden de 1000. El resultado final de este método es que puede ajustarlo fácilmente para producir valores impresos (excluyendo el prefijo) en un rango deseado y con un número de dígitos significativos para su elegir. En comparación con el caso de las utilidades estándar con -hconmutadores, donde el formato suele ser fijo.

Por supuesto, este cálculo a menudo se puede hacer más eficiente y / o elegante, pero esa es una pregunta para el lenguaje específico en el que está escrito. Francamente, si se usa en un script de usuario que se ejecuta solo de vez en cuando para ver interactivamente alguna información, la eficiencia no es realmente una preocupación.

Johan E
fuente
4

Creo que querías la suma de ambos sizeyuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t
Pradeepchhetri
fuente
Lo mismo ocurre con lo anterior.
usuario32398
@ user32398: Hay diferencias amigo.
pradeepchhetri
Al final de mi respuesta a esta pregunta, elaboré un poco sobre por qué no utilizar un enfoque awk simplista (justo size+=$1) para esta pregunta. Este método realmente no es compatible con la -hopción de df.
Johan E
2

Usaría una herramienta como awk:

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

Dónde:

  • /^\/dev\/sd[ab]/es un patrón para filtrar solo aquellas líneas que comienzan con /dev/sdao/dev/sdb
  • { sum+=$5 } agregue el quinto campo para cualquier coincidencia del patrón anterior

Puede encontrar algunas awkreferencias útiles en la wiki de Awk.info .

jasonwryan
fuente
Creo que no es suficiente sumar el%, pero gracias entiendo la idea.
user32398
1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'
sandeep
fuente
1
Pidió size, % usedy available. No solo% usado. También @mdpc tiene un mejor método para seleccionar la unidad, pero si desea emparejar el patrón awk puede hacerlo: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b
0

Si lo desea con alertas, lo hago con IFTTT, Telegram y WebHooks (que es todo gratis)

#!/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
fuente