Como capturar a porcentagem de uso do disco de uma partição como um número inteiro?

16

Eu gostaria de um método para capturar o uso do disco de uma partição específica, usando o diretório em que a partição está montada. A saída deve ser apenas um número inteiro sem preenchimento ou símbolos a seguir, como eu gostaria de salvá-lo em uma variável.

Eu usei df --output=pcent /mount/point, mas preciso aparar a saída, pois ela tem um cabeçalho desnecessário, preenchimento de espaço único antes do valor e um símbolo de% após o valor da seguinte forma:

Use%
 83%

Nesse caso, a saída que eu gostaria seria simplesmente 83. Não conheço nenhuma desvantagem em usar a saída de df, mas estou feliz em aceitar outros métodos que não dependem dela.

Arronical
fonte
11
por que não simplesmente analisá-lo?
Jacob Vlijm
11
Também não vejo uma desvantagem, você pode remover o cabeçalho com df e | tr -DC '0-9'
Estou corrigido, não consigo encontrar a opção para remover o cabeçalho do df.
Eu tinha lido a página de manual e a página de informações e também não consegui encontrá-la @ bc2946088, bom grito a considerar tr, estava colocando minha cabeça em uma confusão com idéias sed e awk.
Arronical 10/11
3
Também procurei remover a opção de cabeçalho. Basicamente, os desenvolvedores do GNU relutam em implementá-lo. Houve pedidos de recursos e eles apenas disseram que não.
Sergiy Kolodyazhnyy

Respostas:

19

Eu usaria ...

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

Não tenho certeza se o sed é mais rápido, mas não consigo me lembrar dos valores do sed.

muru
fonte
11
Usar timepara testar é tão rápido quanto sed.
Arronical 10/11
4
@ Arronical, a menos que suas saídas sejam maiores que 100%, duvido que você veja muita diferença. : P
muru 10/11
@ Arronical O que muru disse; tempo de invocação é provável que domine.
a CVn
11
Nesse caso, tré mais fácil ler do que sed.
Paddy Landau
7

Aqui está a solução awk:

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

Basicamente, o que acontece aqui é que tratamos o caractere '%' como separador de campo (delimitador de coluna) e imprimimos a primeira coluna $ 1 apenas quando o número de registros for igual a dois (a NR==2parte)

Se quiséssemos usar bashferramentas -only, poderíamos fazer algo assim:

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

E por diversão, alternativa sedvia grupo de captura e -rpara regex estendido:

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

sed solução

df --output=pcent /mount/point | sed '1d;s/^ //;s/%//'
  • 1d excluir a primeira linha
  • ; separar comandos
  • s/^ // remover um espaço do início das linhas
  • s/%//remover %sinal
Zanna
fonte
6

Você pode canalizar para um grepque apenas extraia dígitos:

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

Veja ao vivo:

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

Encontrei um servidor em que --output = pcent ainda não estava implementado, então usei a saída normal, filtrada por coluna, seguida pelo regex: df /mount/point | awk '{print $5}' | tr -dc '0-9'

Ramon Fincken
fonte
11
Você deve adicionar -P ou --portability ao df; caso contrário, se o / mount / point for muito longo, ele quebrará a linha e você obterá o valor errado.
SvennD 15/02/19
1

Solução em duas etapas do Bash

Sendo um pouco fã do bash (Borne Again SHell) no ano passado, pensei em propor uma solução para usá-lo.

$ DF_PCT=$(df --output=pcent /mnt/d)
$ echo ${DF_PCT//[!0-9]/}
5
  • A linha 1 captura a dfsaída para variável DF_PCT.
  • A linha 2 retira tudo o que não é um dígito DF_PCTe o exibe na tela.
  • A vantagem sobre a resposta aceita é o avanço de linha após a porcentagem ( 5nesse caso) ser gerada.
WinEunuuchs2Unix
fonte
1

Aqui está outra solução:

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