#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
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 : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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 ).
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
@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
GUL Bordeaux : Giroll – Services libres : TdCT.org
Hide in your shell, scripts & astuces : applications dans un tunnel – smart wget – trouver des pdf – install. auto de paquets – sauvegarde 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
... 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