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.


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.


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}'

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

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

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'


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.

1

Aqui está outra solução:

df | grep /mount/point | awk '{ print $5 }' | cut -d'%' -f1
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.