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 14/08/2014, à 23:27

jean-luc5629

[Résolu]:sed recuperer un entier dans une variable

Bonsoir;

J'ai une variable de ce type :

 echo $bw
Current bandwidth utilization 100.53 KB/s

sachant que la valeur numérique change, 1chiffre, 2 chiffres, 3 chiffres avant la virgule:
ex :
Current bandwidth utilization 100.53 KB/s
Current bandwidth utilization 97.71 KB/s
Current bandwidth utilization 107.16 KB/s
Current bandwidth utilization 8.43 KB/s

Je voudrais juste extraire l'entier dans une variable bw1 , pour l'exemple ci dessus :
bw1=100
bw1=97
bw1=107
bw1=8
J'ai essayé de comprendre avec sed...mais je patauge.

Merci

Dernière modification par jean-luc5629 (Le 15/08/2014, à 13:44)

Hors ligne

#2 Le 14/08/2014, à 23:54

melixgaro

Re : [Résolu]:sed recuperer un entier dans une variable

Salut,

Voilà une proposition

$ echo "${bw}"
Current bandwidth utilization 100.53 KB/s
$ bw1="$(sed 's/.* \([0-9.]\{1,\}\) .*/\1/g' <<< "${bw}")"               # Extrait le nombre réél
$ echo "${bw1}"
100.53
$ bw1=$(sed 's/.* \([0-9]\{1,\}\)\([0-9\.]\{0,\}\) .*/\1/g' <<< "${bw}")            # Extrait la partie entière
$ echo "${bw1}"
100

PS : les lignes commençant par le signe « $ » sont les instructions, les autres lignes sont le résultat de ces instructions


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#3 Le 15/08/2014, à 00:04

jean-luc5629

Re : [Résolu]:sed recuperer un entier dans une variable

melixgaro a écrit :

Salut,

Voilà une proposition

$ echo "${bw}"
Current bandwidth utilization 100.53 KB/s
$ bw1="$(sed 's/.* \([0-9.]\{1,\}\) .*/\1/g' <<< "${bw}")"               # Extrait le nombre réél
$ echo "${bw1}"
100.53
$ bw1=$(sed 's/.* \([0-9]\{1,\}\)\([0-9\.]\{0,\}\) .*/\1/g' <<< "${bw}")            # Extrait la partie entière
$ echo "${bw1}"
100

PS : les lignes commençant par le signe « $ » sont les instructions, les autres lignes sont le résultat de ces instructions

Merci;
J'avais trouvé une solution à l'arrache et pas très esthétique en passant par un fichier:

echo $bw > /tmp/file.txt
sed -i -e "s/Current bandwidth utilization //g" /tmp/file.txt
sed -i -e "s/\..*KB\/s//g" /tmp/file.txt
bw1=`cat /tmp/file.txt`

Ta solution parait  et est + pro..encore merci

Hors ligne

#4 Le 15/08/2014, à 00:26

melixgaro

Re : [Résolu]:sed recuperer un entier dans une variable

ben ravi d'avoir pu aider !


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#5 Le 15/08/2014, à 06:04

nesthib

Re : [Résolu]:sed recuperer un entier dans une variable

@jean-luc5629 : une règle d'or : à moins d'avoir besoin d'un fichier, de persistance des données (redémarrage, multiples programmes…) ou de travailler sur des quantités énormes de données, ne JAMAIS utiliser des fichiers pour stocker des informations temporaires dans un script. Dans ton cas un fichier est totalement inutile, beaucoup plus lourd et plus lent (accès disque).

une solution plus simple :

bw1=$(grep -oP '(?<= )[0-9]+(?=\.)' <<<"$bw")

voire :

bw1=$(grep -oP '(?<= )[0-9]+' <<<"$bw")

GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#6 Le 15/08/2014, à 09:11

credenhill

Re : [Résolu]:sed recuperer un entier dans une variable

hello
et aussi

bw1=$(awk -F "[ .]" '{print $4}' <<<"$bw")

Hors ligne

#7 Le 15/08/2014, à 09:21

melixgaro

Re : [Résolu]:sed recuperer un entier dans une variable

oh mon dieu !

Je me doutais que les as du shell, présents sur le forum, arriveraient à pondre une ligne de commande un peu plus synthétique que la mienne...
Merci credenhill, si je comprends bien, on peut spécifier plusieurs séparateurs de champ dans awk. Je ne savais pas (bon, je n'en ai jamais éprouvé le besoin non plus wink).

bonne journée !

Dernière modification par melixgaro (Le 15/08/2014, à 09:21)


Linux depuis ~2007. Xubuntu seulement.

Hors ligne

#8 Le 15/08/2014, à 10:31

credenhill

Re : [Résolu]:sed recuperer un entier dans une variable

@melixgaro: on peut aussi utiliser une ou plusieurs expressions régulières (séparées par |)   comme séparateurs de champs ou d'enregistrements

Hors ligne

#9 Le 15/08/2014, à 13:43

jean-luc5629

Re : [Résolu]:sed recuperer un entier dans une variable

nesthib a écrit :

@jean-luc5629 : une règle d'or : à moins d'avoir besoin d'un fichier, de persistance des données (redémarrage, multiples programmes…) ou de travailler sur des quantités énormes de données, ne JAMAIS utiliser des fichiers pour stocker des informations temporaires dans un script. Dans ton cas un fichier est totalement inutile, beaucoup plus lourd et plus lent (accès disque).

une solution plus simple :

bw1=$(grep -oP '(?<= )[0-9]+(?=\.)' <<<"$bw")

voire :

bw1=$(grep -oP '(?<= )[0-9]+' <<<"$bw")

Bonjour;
Je savais que ma méthode n'était pas la bonne, et surtout un peu lourde (brute de fonderie), et qu'il y avait moyen de le faire en une seule ligne sans passer par un fichier; néanmoins j'ai souvent du mal avec sed et à surtout à le comprendre.

Merci à vous tous pour cette aide, je marque (Résolu].

Hors ligne

#10 Le 16/08/2014, à 02:56

nesthib

Re : [Résolu]:sed recuperer un entier dans une variable

En l'occurrence sed n'est pas le meilleur outil pour ce que tu cherchais à faire. Tu veux récupérer un morceau de texte au sein d'un plus gros texte, grep est l'outil idéal.

Une petit explication de ma commande :

  • Par défaut grep affiche les lignes contenant le motif cherché, l'option -o permet de n'afficher que le motif cherché.

  • L'option -p permet d'utiliser des expression rationnelles avancés (type perl).

  • [0-9]+ signifie qu'on cherche une suite de chiffres (au moins un chiffre), on pourrait aussi utiliser l'expression \d+ (\d = digit).

  • Si l'on ne donne pas d'autre critère la partie décimale sera aussi retournée, pour cela on doit ajouter une limitation, on va demander de ne garder que les nombres précédés d'une espace. Toutefois on ne veut que l'espace apparaisse dans la sortie, seulement vérifier qu'il est là. L'outil idéal est le « lookbehind » (regarder derrière) : (?<=…) où « … » est le motif recherché, ici une espace.

  • De même on peut vérifier que le caractère suivant est un point (grâce à (?=\.)), mais ça n'est pas indispensable (d'où mes deux solutions). Il faut simplement penser à échapper le point car, par défaut, un point correspond à n'importe quel caractère.

  • Le $(…) permet de lancer la commande dans un sous shell et d'instancier la variable bw1 : bw1=$(…).

  • La syntaxe <<< permet de rediriger le contenu d'une chaîne de caractère (ici le contenu de la variable bw) vers l'entrée d'une commande (de la même façon que < permet de rediriger le contenu d'un fichier).

Voilà, j'espère que ça sera plus clair pour toi wink


GUL Bordeaux : GirollServices libres : TdCT.org
Hide in your shell, scripts & astuces :  applications dans un tunnelsmart wgettrouver des pdfinstall. auto de paquetssauvegarde auto♥ awk
  ⃛ɹǝsn xnuᴉꞁ uʍop-ǝpᴉsdn

Hors ligne

#11 Le 16/08/2014, à 14:25

melixgaro

Re : [Résolu]:sed recuperer un entier dans une variable

salut nesthib et merci pour les explications !
j'avais pensé à grep aussi mais comme jean-luc5629 avait demandé sed, j'ai fait avec sed wink
... et puis ma solution aurait été bien moins élégante que la tienne.
Je n'ai pas l'habitude des regex de type perl, seulement des étendues (elles sont appelées comme ceci dans le man de grep) obtenues via -E


Linux depuis ~2007. Xubuntu seulement.

Hors ligne