|
|
|
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 ? |
|
|
|
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 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. |
|
|
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... ;-) |
|
|
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 ! |
|
|
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.... |
|
|
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. |
|
|
> 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 |
|
|
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. |
|
|
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. |
|
|
-[ 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 ! :-) |
|
|
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 reguliere
|
|
Expression reguliere
|
|
expression régulière
|
Fuseau horaire GMT +2. Il est actuellement 21h41. | Privacy Policy
|