cerhu > linux.debian.user.french

Sylvain A. (22/10/2006, 10h20)
Bonjour à tous,

Je n'ai jamais vraiment eu le temps de m'intéresser aux expressions
régulières, mais aujourd'hui j'aurais besoin d'extraire de cette ligne
(résultat d'un ping) les trois variables min avg et max :
rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
200.289/37.388 ms

Evidemment, je ne sais pas faire ... je suis sûr que c'est le genre de
truc qui se fait en une petite ligne avec sed ou awk ... un bonne âme
pourrait-elle m'aider ?
pascal (22/10/2006, 12h00)
Sylvain A. a écrit :
> Bonjour à tous,
> Je n'ai jamais vraiment eu le temps de m'intéresser aux expressions
> régulières,

Il faudrait peut-être chercher un peu...
mais aujourd'hui
comme c'est dimanche...
j'aurais besoin d'extraire de cette ligne
> (résultat d'un ping) les trois variables min avg et max :
> rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
> 200.289/37.388 ms
> Evidemment, je ne sais pas faire ... je suis sûr que c'est le genre de
> truc qui se fait en une petite ligne avec sed ou awk ... un bonne âme
> pourrait-elle m'aider ?

Là c'est franchement limite comme question.
Il n'y a même besoin d'expression régulière !
Allez zou sans réfléchir...
echo "rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
200.289/37.388 ms " | cut -d" " -f4 | cut -d"/" -f1
donne min
-f2--> max et -f3-6--> avg.
A +
Pascal
pascal (22/10/2006, 12h00)
pascal a écrit :
[..]
> 200.289/37.388 ms " | cut -d" " -f4 | cut -d"/" -f1
> donne min
> -f2--> max et -f3-6--> avg.

^^^^^^^^^^^^^^^^^^^^^^^^^^^^
Ooops erreur de frappe : il fallait lire -f3 ---> avg bien sûr.
P.
Txo (22/10/2006, 12h20)
En ce dimanche 22 octobre 2006 à 11:54:14 pascal nous susurrait :

> Allez zou sans réfléchir...
> echo "rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
> 200.289/37.388 ms " | cut -d" " -f4 | cut -d"/" -f1
> donne min
> -f2--> max et -f3-6--> avg.


Je peux témoigner que cela nécessite de réfléchir pour une majorité de
personnes... ;-)
Sylvain A. (22/10/2006, 12h40)
Salut,

> Il faudrait peut-être chercher un peu...
> mais aujourd'hui comme c'est dimanche... Ok, c'est vrai ... promis, je m'y mets dès que j'en ai le temps ;-)
> Là c'est franchement limite comme question.
> Il n'y a même besoin d'expression régulière !
> Allez zou sans réfléchir...
> echo "rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
> 200.289/37.388 ms " | cut -d" " -f4 | cut -d"/" -f1
> donne min
> -f2--> max et -f3-6--> avg

Je me doutais bien que ce n'était pas difficile, mais je n'avais pas la
moindre idée de comment faire ça. Je découvre du coup la commande "cut" ;-)
Merci beaucoup en tout cas !
Laurent FRANCOIS (23/10/2006, 00h40)
Txo wrote:
> En ce dimanche 22 octobre 2006 à 11:54:14 pascal nous susurrait :
> Je peux témoigner que cela nécessite de réfléchir pour une majorité de
> personnes... ;-)

Pareil pour moi, je connaissais pas cut et en plus j'ai réfléchi
et j'ai pas encore tout compris glupps....
pascal (23/10/2006, 15h10)
Laurent FRANCOIS a écrit :
> Txo wrote:
> Pareil pour moi, je connaissais pas cut et en plus j'ai réfléchi
> et j'ai pas encore tout compris glupps....
>Bon alors le terme "réfléchir" était mal choisi...

Je voulais dire que ce genre de chose est assez basique tout de même et
qu'avec un peu de lecture on y arrive sans peine.
Par exemple:
[..]
Voilà.
P.
Marc Chantreux (23/10/2006, 15h30)
> Bon alors le terme "réfléchir" était mal choisi...
> Je voulais dire que ce genre de chose est assez basique tout de même et
> qu'avec un peu de lecture on y arrive sans peine.


Oui ... et en lisant un peu plus loin, on se rend compte que le problème
n'est pas si basique que ca. Par exemple : la solution sera totalement
différente en fonction du volume de données a traiter.

Dans tous les cas, je crois lancer 2 fois cut n'était pas une bonne idée.

Voici 3 facons de faire ( 1 avec cut et 2 sans aucune commande externe )

> for f ( * ) { echo -e "\n\n$f ---------------\n" ; cat $f ;echo ; command time dash $f }


cut.sh ---------------

line='rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
200.289/37.388 ms
' | cut -d" " -f4 | cut -d"/" -f1 > /dev/null

0.00user 0.00system 0:00.01elapsed 80%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+461minor)pagefaults 0swaps

shellway2.sh ---------------

echo 'rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
200.289/37.388 ms' |
while IFS=' ' read rtt names equals values rest; do
echo $values | while IFS='/' read mix avg max ; do
echo min $mix > /dev/null
done
done

0.00user 0.00system 0:00.00elapsed 83%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+227minor)pagefaults 0swaps

shellway.sh ---------------

line='rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma
200.289/37.388 ms'
vire_prefix=${line%ms, *}
final=${vire_prefix#*=}
echo $final | while IFS='/' read mix avg max ; do
echo min $mix > /dev/null
done

0.00user 0.00system 0:00.00elapsed 75%CPU (0avgtext+0avgdata 0maxresident)k
0inputs+0outputs (0major+189minor)pagefaults 0swaps
pascal (23/10/2006, 17h20)
Marc Chantreux a écrit :
[..]
> final=${vire_prefix#*=}
> echo $final | while IFS='/' read mix avg max ; do
> echo min $mix > /dev/null
> done
> 0.00user 0.00system 0:00.00elapsed 75%CPU (0avgtext+0avgdata 0maxresident)k
> 0inputs+0outputs (0major+189minor)pagefaults 0swaps

Oui bien sûr
Il faut être sérieux...
1°) on n'a pas parlé ici de volumes considérables de données...
2°) franchement ces considérations seront-elles pertinentes pour des
gens qui ignorent la commande "cut" (ceci dit sans aucun à-priori, il
faut bien commencer un jour...) ?
3°) j'ai bien précisé que je donnais UNE solution et en l'occurence la
première qui me venait à l'esprit. Que celle-ci ne soit pas optimale je
veux bien en convenir...Mais ça n'est pas trop le propos.
4°) en utilisant parot on devrait obtenir encore de bien meilleures perfs...

Trève de plaisanterie, ce que je faisais juste remarquer et qui reste
valable , c'est que sans trop de peine, on peut obtenir rapidement une
solution convenable (quoique non optimale) en ayant cherché un peu.
Ce que le Monsieur a admis du reste.

P.
Marc Chantreux (23/10/2006, 18h30)
pascal wrote:

> Oui bien sûr
> Il faut être sérieux...


je suis :)

> 2°) franchement ces considérations seront-elles pertinentes pour des
> gens qui ignorent la commande "cut" (ceci dit sans aucun à-priori, il
> faut bien commencer un jour...) ?


je faisais part de ces remarques justement a cause de cela: je suis
souvent face a des gens qui utilisent tel ou tel filtre simplement par
habitude. Je crois qu'il est bon de montrer d'autres manières de faire
meme si ces dernières n'ont pas utilisées immédiatement.

> 3°) j'ai bien précisé que je donnais UNE solution et en l'occurence la
> première qui me venait à l'esprit. Que celle-ci ne soit pas optimale je
> veux bien en convenir...Mais ça n'est pas trop le propos.


je n'ai nullement remis en cause ta réponse, je ne faisais que tenter de
l'enrichir.

> 4°) en utilisant parot on devrait obtenir encore de bien meilleures perfs...


voui !!! oh voui !!!! ahhhh ..... ahhh .... L'attente est insoutenable
: j'utilise pugs depuis qq temps deja.
rixed (24/10/2006, 09h20)
-[ Mon, Oct 23, 2006 at 03:24:05PM +0200, Marc Chantreux ]----
> Dans tous les cas, je crois lancer 2 fois cut n'était pas une bonne idée.


Ah bon ? Pourquoi ?

C'est le nombre de cut oubien le nombre de pipe qui t'inquiètes ?
Moi à vu de nez je pense que cut est beaucoup plus rapide que de
traiter les lignes en shell.

S'il y a une seule ligne à traiter, toutes les solutions se valent.
S'il y en a plein, voici ce que ça donne :

date; yes "rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma 200.289/37.388 ms" |
head -10000 |
while IFS=' ' read rtt names equals values rest; do echo $values |
while IFS='/' read mix avg max ; do echo $mix ; done;
done > /dev/null; date
Tue Oct 24 09:06:22 CEST 2006
Tue Oct 24 09:06:46 CEST 2006

Comparé à :

date; yes "rtt min/avg/max/mdev = 33.978/37.560/52.277/5.500 ms, ipg/ewma 200.289/37.388 ms" |
head -10000 |
cut -d" " -f4 |
cut -d"/" -f1 > /dev/null; date
Tue Oct 24 09:07:40 CEST 2006
Tue Oct 24 09:07:40 CEST 2006

C'est beaux, les pipes UNIX ! :-)
Marc Chantreux (26/10/2006, 13h20)
Salut,

le 24/10/2006,
rixed nous ?ivait :
> Ah bon ? Pourquoi ?


Ta reponse prouve que je n'ai pas reussi a faire passer mon message.

Pour faire court :

content | while read; do echo ${REPLY% *} ; done
content | cut -f1
content | awk '{ print $1 }'
content | sed 's/ .*//'
content | perl -F' ' -lane 'print $F[0]'

toutes sont des solutions valide. Le fait de choisir l'une ou l'autre
depend du volume de donnees a traiter.

MAL :
echo ma ligne | cut -f1
BIEN :
echo ma ligne | while read f1 rest; do
echo $f1
done
ZSH (tres bien ! ;-) ) :
read f1 reste <<< "ma ligne"

BIEN :
yes ma ligne | head -n1000 | cut -f1
# beaucoup de donnes a traiter, les forks valent le coup!
MAL :
yes ma ligne | head -n1000 | while read f1 rest; do $f1 ; done
# shell est mauvais dans le traitement des chaines.
Discussions similaires
Expression régulière

Expression régulière...

Expression reguliere

expression régulière


Fuseau horaire GMT +2. Il est actuellement 03h40. | Privacy Policy