#1 Le 10/08/2010, à 23:18
- lauben
[REGEXP/DSTAT] Extraction de sous chaines depuis regexp
Bonsoir,
Je souhaite faire des graphiques avec le programme gnuplot de linux a partir du résultat de la commande dstat.
Je cherche donc a adapter le résultat donné par dstat dans la mesure où celui-ci indique des valeurs en Megas, K, Bytes et ainsi tout mettre dans la même unité.
J'ai essayé des solutions dans un script bash avec sed, expr... sans succès.
Voici un résumé de ce que j'ai et ce que je souhaite obtenir ;
2989M 26.2M 2899M 55.7M| 27B 2280B| 20M 11M|5344 20k
3033M 25M 2871M 40.2M| 218B 4164B|5717k 3326k|1747 5930
Et ce que je souhaite obtenir:
2989000000 26200000 2899000000 55700000| 27 2280| 20000000 110000000|5344 20000
3033000000 25000000 2871000000 40200000| 218 4164|5717000 3326k|1747 5930
Il n'est pas bien compliqué de remplacer les M et K en 6 ou 3 zeros, le problème se situe dans les cas où dstat indique 27.4M par ex.
J'ai des expressions régulières comme ci dessous mais je ne parviens pas à récupérer dans 2 variables différentes le résultat des sous chaines 458 et 5 par ex.
msg="458.5M";
expr "$msg" : '\([0-9]\+\)\.\([0-9]\+\)M'
Si quelqu'un a une autre méthode je suis preneur
Merci d'avance,
Cordialement,
Benoit
Hors ligne
#2 Le 10/08/2010, à 23:24
- sputnick
Re : [REGEXP/DSTAT] Extraction de sous chaines depuis regexp
Tu peut t'inspirer de cette fonction pour trier la sortie de du :
DuTop ()
{
du ${1-.} | sort -n | awk 'BEGIN {u[0]="K";u[1]="M";u[2]="G";}
{ size=$1;sub(/^[^\t]+\t+/,"");name=$0
for (i=3;i>=0;--i) {
if ( size > 1024 ^i)
{printf "%.2f%s\t%s\n",(size / 1024^i),u[i],name;next}}}'
}
On ne peut pas mettre d'array dans un string!
https://sputnick.fr/
Hors ligne
#3 Le 10/08/2010, à 23:54
- ehmicky
Re : [REGEXP/DSTAT] Extraction de sous chaines depuis regexp
Sinon, si tu es sûr qu'il n'y a qu'un seul chiffre après le point, tu peux faire :
NOMBRE="26.6M 54.3K"
#Ou NOMBRE="$(cat FICHIER)" si tu veux convertir un fichier et non une string
NOMBRE=${NOMBRE//M/000000}
NOMBRE=${NOMBRE//K/000}
<<<"$NOMBRE" sed 's/\.\([[:digit:]]*\)0/\1/g'
Si les performances comptent vraiment, il y a moyen de convertir le sed en full-bash, mais ce sera moins lisible.
Par contre, ça prend en charge que les Méga et Kilo. Tu peux suivre le même principe pour Giga, etc., et tu peux supprimer les B avec :
NOMBRE=${NOMBRE//B}
si B signifie bits et non blocs. Par contre, cela gère pas les "b" signifiant blocs. Par ailleurs, c'est en Mo et non Mio (multiple de 1000 et non 1024), or dstat utilise des Mio, du coup la solution de sputnik est plus exacte.
Dernière modification par ehmicky (Le 11/08/2010, à 01:26)
Stego++, bibliothèque libre de stéganographie (avec cryptographie), à venir !
Besoin de votre aide :
Stats sur les compilateurs C++ les plus utilisés
Comment utiliser les archetypes C++ ?
Hors ligne