web-dev-qa-db-fra.com

Comment faire pour que GREP sélectionne uniquement les valeurs numériques?

J'utilise la commande df dans un script bash:

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

Ce script renvoie:

99%

Mais je n'ai besoin que de chiffres (pour faire la comparaison suivante). Si j'utilise l'expression grep sans le point:

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

Je ne reçois rien. Comment réparer?

19
user710818

Si tu essayes:

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

Il renvoie:

99

Voici les détails sur le -o (ou --only-matching flag) fonctionne depuis la page de manuel grep .

Imprimer uniquement les parties correspondantes (non vides) des lignes correspondantes, chacune de ces parties sur une ligne de sortie distincte. Les lignes de sortie utilisent les mêmes délimiteurs en entrée et les délimiteurs sont des octets nuls si -z (--null-data) est également utilisé (voir Autres options ).

42
Kent

grep imprimera tout lignes correspondant au motif que vous fournissez. Si vous souhaitez uniquement imprimer la partie de la ligne qui correspond au motif, vous pouvez passer l'option - o:

- o, --only-matching Imprime uniquement les parties correspondantes (non vides) d'une ligne correspondante, chacune de ces parties sur une ligne de sortie distincte.

Comme ça:

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

Que diriez-vous:

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

Pas besoin d'utiliser grep ici, essayez ceci:

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'utilisez pas plus de commandes que nécessaire, laissez la queue, grep et cut. Vous pouvez le faire avec seulement (un simple) awk

PS: donner une taille de bloc en impression uniquement de persentage est un peu idiot ;-) Alors laissez aussi de côté le "-B MB"

df. | awk -F '[séparateurs de champs multiples]' '$ NF == "Le dernier champ doit être exactement -> patition montée" {print $ (NF --- numéro du dernier champ)} '

dans votre cas, utilisez:

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

sortie: 81

Si vous souhaitez afficher le symbole de pourcentage, vous pouvez laisser le -F '[%]' éloigné et votre champ d'impression reculera d'un champ plus loin

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

sortie: 81%

1
Donovan