Contenu | Rechercher | Menus

Annonce

Si vous avez des soucis pour rester connecté, déconnectez-vous puis reconnectez-vous depuis ce lien en cochant la case
Me connecter automatiquement lors de mes prochaines visites.

À propos de l'équipe du forum.

#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