IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Linux Discussion :

[SHELL/BASH] Extraction de sous chaines dans une variable


Sujet :

Linux

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    49
    Détails du profil
    Informations forums :
    Inscription : Mai 2006
    Messages : 49
    Points : 51
    Points
    51
    Par défaut [SHELL/BASH] Extraction de sous chaines dans une variable
    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 ;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    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:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    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.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    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

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    msg="458.5M";
    echo "${msg//+(.|M)}"
    4585
    là, il ne faut plus ajouter 6, mais 5 zéros...


    ou alors :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    dstatSample() { echo "----total-cpu-usage---- -dsk/total- -net/total- ---paging-- ---system--
    usr sys idl wai hiq siq| read  writ| recv  send|  in   out | int   csw 
    5   0  93   0   0   0| 154k   84k|   0     0 |   0     0 |1081  1116 
    13   0  87   0   0   0|   0     0 |   0     0 |   0     0 |1036   696 
    8   0  92   0   1   0|   0  8192B|   0     0 |   0     0 |1073   936 
    0   0  99   0   0   1|   0     0 |   0     0 |   0     0 |1072   940 
    1   1  97   0   2   0|   0     0 |   0     0 |   0     0 |1252  1727 
    1   1  98   0   1   0|   0     0 |   0     0 |   0     0 |1126  1191 
    1   0  99   0   0   0|   0     0 |   0     0 |   0     0 |1045   908 
    0   0  99   0   0   0|   0    44k|   0     0 |   0     0 |1051   904 
    1   1  99   0   0   0|   0     0 |   0     0 |   0     0 |1036   850 
    1   0 100   0   0   0|   0     0 |   0     0 |   0     0 |1029   757"
    }
    while IFS='|' read -a line
    do for item in "${line[@]}"
       do for i in $item
          do case $i in
                *M) i="$(bc<<<"${i%M}*1000000")";;
                *k) i="$(bc<<<"${i%k}*10000")";;
                *B) i="${i%B}";;
             esac
             echo -n " ${i%.0} "
          done
          echo -n "|"
       done; printf $"\b\b\e[K\n"
    done < <(tail -n +3 <(dstatSample))
     5  0  93  0  0  0 | 1540000  840000 | 0  0 | 0  0 | 1081  1116
     13  0  87  0  0  0 | 0  0 | 0  0 | 0  0 | 1036  696
     8  0  92  0  1  0 | 0  8192 | 0  0 | 0  0 | 1073  936
     0  0  99  0  0  1 | 0  0 | 0  0 | 0  0 | 1072  940
     1  1  97  0  2  0 | 0  0 | 0  0 | 0  0 | 1252  1727
     1  1  98  0  1  0 | 0  0 | 0  0 | 0  0 | 1126  1191
     1  0  99  0  0  0 | 0  0 | 0  0 | 0  0 | 1045  908
     0  0  99  0  0  0 | 0  440000 | 0  0 | 0  0 | 1051  904
     1  1  99  0  0  0 | 0  0 | 0  0 | 0  0 | 1036  850
     1  0  100  0  0  0 | 0  0 | 0  0 | 0  0 | 1029  757
    ...
    ?

  3. #3
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 720
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 720
    Points : 31 043
    Points
    31 043
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par lauben Voir le message
    Il n'est pas bien compliqué de remplacer les M et K en 6 ou 3 zeros
    Que les vendeurs de disques fassent semblant de ne pas savoir qu'un ko c'est 1024 octets et qu'un Mo c'est 1024 ko, et qu'ils indiquent 500Go lorsqu'il n'y en a que 466, je veux bien (en fait je supporte pas mais mis à part aller au tribunal, je vois pas quoi faire d'autre).
    Mais que qqun qui est un tant soi peu du métier fasse l'erreur, là ça l'est beaucoup moins...

    Citation Envoyé par lauben Voir le message
    Si quelqu'un a une autre méthode je suis preneur
    A la base, faut dissocier le nombre de la lettre. Et ensuite, si le nombre contient un "." , alors dissocier la partie entière de la partie décimale. awk pourrait être une solution. Ou alors Python...

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Citation Envoyé par Sve@r Voir le message
    Que les vendeurs de disques fassent semblant de ne pas savoir qu'un ko c'est 1024 octets et qu'un Mo c'est 1024 ko, et qu'ils indiquent 500Go lorsqu'il n'y en a que 466, je veux bien (en fait je supporte pas mais mis à part aller au tribunal, je vois pas quoi faire d'autre).
    Mais que qqun qui est un tant soi peu du métier fasse l'erreur, là ça l'est beaucoup moins...
    C'est devenu encore plus pénible depuis que le S.I. a décidé de s'en mêler. Ils ont décrété que les ko, Mo, Go, To et suivants devaient s'aligner sur les multiples de 10 « parce qu'ils étaient là avant » et que les puissances de 2 devraient désormais s'appeler kio, Mio, Gio, Tio et s'énoncer « kibioctet, Mébioctet, Gibioctets » et autres Shadocktets.

    Donc, avant, il y avait un état de l'art dans la discipline, qui avait une raison d'être, maintenant il y aura toujours un doute. Parle-t-on d'« ancien kilo-octet » (celui d'avant le grand chamboulement du S.I.) ou celui d'après, et dans ce cas, l'unité a-t-elle été utilisée par un suiveur de la C.G.P.M. ou par un rebelle ? J'arrête là car je sens que je m'aigris. :-)

  5. #5
    Modérateur
    Avatar de gangsoleil
    Homme Profil pro
    Manager / Cyber Sécurité
    Inscrit en
    Mai 2004
    Messages
    10 150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Savoie (Rhône Alpes)

    Informations professionnelles :
    Activité : Manager / Cyber Sécurité

    Informations forums :
    Inscription : Mai 2004
    Messages : 10 150
    Points : 28 123
    Points
    28 123
    Par défaut
    Bonjour,

    Citation Envoyé par lauben Voir le message
    Si quelqu'un a une autre méthode je suis preneur
    Solution 1 :
    Utiliser les outils de base, qui permettent tous d'afficher les valeurs en unité, et non pas en kibibytes ou autres cochonneries de la même veine ?

    Solution 2 :
    attendre que dstat daigne proposer une option permettant de tout avoir dans la meme unite. C'est dans la TODO list :
    ### Usability
    + Allow to force to given magnitude (--unit=kilo)

Discussions similaires

  1. Réponses: 6
    Dernier message: 03/03/2011, 14h16
  2. [XSLT] Extraction d'une sous-chaine dans une chaine?
    Par Marian83 dans le forum XSL/XSLT/XPATH
    Réponses: 1
    Dernier message: 24/04/2009, 16h42
  3. Réponses: 8
    Dernier message: 01/05/2008, 23h15
  4. Rechercher une sous chaine dans une chaine
    Par Oluha dans le forum ASP
    Réponses: 4
    Dernier message: 03/02/2005, 14h39
  5. Extraction de sous-chaine dans une chaine
    Par ma2th dans le forum C
    Réponses: 7
    Dernier message: 07/05/2004, 12h42

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo