ti-enxame.com

Como fazer o GREP selecionar apenas valores numéricos?

Eu uso o comando df em um script bash:

df . -B MB | tail -1 | awk {'print $4'} | grep  .[0-9]*

Este script retorna:

99%

Mas eu preciso apenas de números (para fazer a próxima comparação). Se eu usar o grep regex sem o ponto:

df . -B MB | tail -1 | awk {'print $4'} | grep  .[0-9]*

Eu não recebo nada. Como consertar?

19
user710818

Se você tentar:

 echo "99%" |grep -o '[0-9]*'

Retorna:

99

Aqui estão os detalhes no -o (ou --only-matching flag) funciona a partir de página de manual do grep .

Imprima apenas as partes correspondentes (não vazias) das linhas correspondentes, com cada uma dessas partes em uma linha de saída separada. As linhas de saída usam os mesmos delimitadores da entrada e os delimitadores são bytes nulos se -z (--null-data) também for usado (consulte Outras opções ).

42
Kent

grep imprimirá qualquer linhas que corresponda ao padrão que você fornece. Se você deseja imprimir apenas a parte da linha que corresponde ao padrão, pode passar a opção - o:

- o, - correspondência única Imprime apenas as partes correspondentes (não vazias) de uma linha correspondente, com cada uma dessas partes em uma linha de saída separada.

Como isso:

echo 'Here is a line mentioning 99% somewhere' | grep -o '[0-9]+'
9
Martin

E se:

df . -B MB | tail -1 | awk {'print $4'} | cut -d'%' -f1
1
Alex Howansky

Não há necessidade de usar grep aqui, tente o seguinte:

df . -B MB | tail -1 | awk {'print substr($5, 1, length($5)-1)'}
1
anubhava
function getPercentUsed() {
    $sys = system("df -h /dev/sda6 --output=pcent | grep -o '[0-9]*'", $val);
    return $val[0];
}
1
mohdzamri

Não use mais comandos do que o necessário, deixe a cauda de fora, cumprimente e corte. Você pode fazer isso com apenas (um simples) awk

PS: dar um tamanho de bloco e imprimir apenas persentage é um pouco bobo ;-) Então, deixe também o "-B MB"

df. | awk -F '[vários separadores de campo]' '$ NF == "O último campo deve ser exatamente -> patição montada" {print $ (NF --- número do último campo)} '

no seu caso, use:

df . |awk -F'[ %]' '$NF=="/" {print $(NF-2)}'

saída: 81

Se você quiser mostrar o símbolo de porcentagem, pode deixar o -F '[%]' ausente e seu campo de impressão moverá um campo mais para trás

df . |awk '$NF=="/" {print $(NF-1)}'

saída: 81%

1
Donovan