Como imprimir a porcentagem de uso de disco no `df -hl`

12

Eu sei que df -hlgera uma lista de todas as minhas partições com seu tamanho, uso como porcentagem e espaço disponível.

Se eu quisesse exibir apenas o tamanho e o uso como uma porcentagem sda2e sda3, por exemplo, como eu poderia dizer ao Linux (Ubuntu) para verificá-los, somar e mostrá-los?

user32398
fonte
1
As respostas abaixo podem ser simplificadas, alterando o comando df que eles usam para colocar os discos na linha de comando df, em vez de analisar todos os discos. ie df -hl / dev / sda [23]
mdpc 14/02

Respostas:

11

Para dfcalcular totais, use a --totalsopção Se você deseja os totais apenas em algumas unidades selecionadas, especifique-os como argumentos.

Exemplos (e saída do meu computador)

Este é o total para todas as montagens locais:

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

Restringindo a algumas unidades (observe que, se o caminho especificado não for um ponto de montagem exato, será utilizado o ponto de montagem contendo o mais próximo [consulte a observação no 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%

ou usando devnomes:

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

Personalização adicional

Se você deseja listar todas as montagens, exceto as 'especiais', pode usar a -xopção para excluir por tipo de partição. (Use a -Topção para mostrar os tipos.)

Pessoalmente, para uso interativo, eu uso o seguinte alias do bash (adicionado a ~/.bash_aliases) para excluir as montagens 'não-físicas'.

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

Nota

A especificação de caminhos nos pontos de montagem pode, em algum momento, produzir resultados diferentes, especificando o caminho exato para o ponto de montagem. Por exemplo, no meu laptop, eu uso sshfspara montar meu servidor de arquivos (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

A raiz do servidor ( /) está montada em ~/.server-root. No entanto, no servidor, os discos estão montados /disks/*, dos quais df(no laptop) não 'sabem'.

Evidentemente, dfpode-se listar o uso do disco nas diferentes montagens no servidor, se houver caminhos adequados. No entanto, mostra o mesmo "Sistema de arquivos" e "Montado em" para todos os caminhos, pois (acredito) esse é o único ponto de montagem (relacionado a esta sshfsmontagem) na tabela local de montagem do kernel.


Outra coisa: não está realmente relacionado à pergunta, mas relacionado a uma resposta anterior à pergunta.

Adicionar números com um awkscript (ou similar), como algumas respostas postadas anteriormente, não é uma boa ideia ao usar o -hsinalizador. Isso ocorre porque é necessário um tratamento especial. Você não pode simplesmente fazer size+=$2;por um campo que está 418Mem uma linha e 12Gem outra e obter algo útil com isso…

Por exemplo awk, adicionando 500Maos 10.2Grendimentos

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

510,2 de quê?

Há claramente um problema aqui. Portanto, apenas como uma dica para lembrar , ao fazer cálculos (automatizados) sobre a saída de df (e outros que podem usar números 'legíveis por humanos' ) . Certifique-se de não usar o -hsinalizador e de que a entrada do script de cálculo seja normalizada (por exemplo, bytes, blocos, KBs ou qualquer outra coisa) e faça o 'display scaling' no final. Não é difícil, na maioria das linguagens de script e de programação, adicionar 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...)

em que o valor está em bytes e o limite é da ordem de 1000. O resultado desse método é que você pode ajustá-lo facilmente para produzir valores impressos (excluindo o prefixo) no intervalo desejado e com vários dígitos significativos para o seu escolhendo. Comparado ao caso com utilitários padrão com -hcomutadores, em que o formato geralmente é fixo.

Obviamente, esse cálculo geralmente pode ser mais eficiente e / ou elegante, mas isso é uma pergunta para o idioma específico em que está escrito. Francamente, se for usado em um script de usuário que é executado apenas agora e depois para visualizar interativamente algumas informações, a eficiência não é realmente uma preocupação.

Johan E
fonte
4

Eu acho que você queria a soma de ambos sizeeuse%

 df -hl | grep 'sda2\|sda3' | awk 'BEGIN{print "Size","Use%"} {size+=$2;percent+=$5;} END{print size,percent}' | column -t
pradeepchhetri
fonte
Idem, o mesmo que acima.
user32398
@ user32398: Existem diferenças, cara.
Pradeepchhetri
No final da minha resposta a essa pergunta, elaborei um pouco sobre por que não usar uma abordagem simplista do awk (apenas size+=$1) para essa pergunta. Este método não é realmente compatível com a -hopção de df.
Johan E
2

Você usaria uma ferramenta como awk:

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

Onde:

  • /^\/dev\/sd[ab]/é um padrão para filtrar apenas as linhas que começam com /dev/sdaou/dev/sdb
  • { sum+=$5 } adicione o quinto campo para quaisquer correspondências do padrão acima

Você pode encontrar algumas awkreferências úteis no wiki do Awk.info .

jasonwryan
fonte
Eu acho que não é suficiente somar o%, mas obrigado, entendi a ideia.
user32398
1
sudo df -hl | grep 'mountdirname' | awk '{print $5}'
sandeep
fonte
1
Ele pediu size, % usede available. Não apenas% usado. Também tem @mdpc um método melhor para destacar a unidade, mas se você queria padrão de jogo awk pode fazer isso: df -hl | awk '/sda2/{print $2,$5,$4}'
jesse_b
0

Se você quisesse com alertas, eu o faço com IFTTT, Telegram And WebHooks (que é tudo grátis)

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