#1 Le 24/11/2018, à 14:17
- LinuxerQuelconque
Pourquoi est-ce que mon script marche et comment l’accélérer ?
Bonjour ,
J'ai essayé de faire une fonction qui fonctionne avec des pipes qui en sortie affiche la ligne sans espaces multiples et sans espace en début et fin de ligne.
Du coup j'ai utilisé une boucle read pour récupérer les infos de sortie en entrée et je n'a rien eu besoin de faire de plus.
Je suis étonné que ça enlève de base les espaces, je pensais que read prenait les espaces en considération.
Le problème est sa vitesse d’exécution, donc comment faire pour développer une version rapide de cette fonction?
#!/bin/bash
normaliseLigne(){
#entier=""
while read data; do
echo $data
#entier=$(echo $entier$data)
done
#echo $entier
}
ps -uax | normaliseLigne
Je vous remercie de votre aide
Dernière modification par LinuxerQuelconque (Le 24/11/2018, à 14:19)
Hors ligne
#2 Le 24/11/2018, à 14:37
- bruno
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
Bonjour,
ps aux | tr -s ' '
#3 Le 24/11/2018, à 14:39
- diesel
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
Ben...,
Le "caractère" de séparation des mots en shell est un ou plusieurs espaces ou une ou plusieurs tabulations.
read lit tous les mots un par un (donc, sans les caractères de séparation) et ensuite, tu réécris chacun de ces mots ($data) avec un espace entre chacun.
Donc, ça marche.
Bon, après, une petit sed (ou awk) sur ton entrée pour remplacer un ou plusieurs espaces par un seul devrait être plus efficace.
Amicalement.
Jean-Marie
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#4 Le 24/11/2018, à 14:44
- diesel
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
Ben...,
Le "caractère" de séparation des mots en shell est un ou plusieurs espaces ou une ou plusieurs tabulations.
read lit tous les mots un par un (donc, sans les caractères de séparation) et ensuite, tu réécris chacun de ces mots ($data) avec un espace entre chacun.
Donc, ça marche.
Bon, après, une petit sed (ou awk) sur ton entrée pour remplacer un ou plusieurs espaces par un seul devrait être plus efficace. Par exemple :
#!/bin/bash
ps aux | sed 's/ */ /g'
[EDIT] Grrrrrrrrrrrrrrrrrrrrrrrr!
Grillé par Bruno.
Et en plus, la solution avec tr me paraît plus élégante (j'ai encore appris quelque chose).[/EDIT]
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 24/11/2018, à 14:49)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne
#5 Le 24/11/2018, à 14:49
- LinuxerQuelconque
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
Nan ça marche pas si on met un truc avec des espaces avant et après c'est-ce qui me tue, par exemple si on prend la technique du sed et qu'on remplace par un double points, on verra que avant le premier mot y a deux points.
Pour le tr c'est moins évident mais ça reste gênant pour faire des cut
Ce que j'aimerais c'est faire une fonction complète qui prennent ça en compte
Qu'est-ce que vous en pensez?
EDIT : Un autre jour ça ne marchait pas avec des greps mal faits mais aujourd'hui ça a l'air de marche avec une bonne configuration !
Merci
Dernière modification par LinuxerQuelconque (Le 24/11/2018, à 14:53)
Hors ligne
#6 Le 24/11/2018, à 15:59
- Watael
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
salut,
ce n'est pas read qui supprime les espaces "excédentaires" (il lit des lignes entières), c'est parce que la variable est affichée sans être entre guillemets :
$ echo "foo bar baz" | { read var; echo "$var";}
foo bar baz
$ echo "foo bar baz" | { read var; echo $var;}
foo bar baz
Connected \o/
Welcome to sHell. · eval is evil.
En ligne
#7 Le 24/11/2018, à 18:44
- diesel
Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?
Ben, si, ça marche :
jean-marie@jean-marie:~$ echo "foo bar baz buz" | tr -s " "
foo bar baz buz
jean-marie@jean-marie:~$
Ça a bien enlevé les espaces en trop. C'est bien ce que tu as demandé ?
Et si tu veux enlever aussi les espaces au début et à la fin de chaque ligne :
ps aux | tr -s " " | sed -e 's/^ //g' -e 's / $//g'
ou
ps aux | sed -e 's/ +//g' -e 's/^ //g' -e 's / $//g'
Amicalement.
Jean-Marie
Dernière modification par diesel (Le 24/11/2018, à 19:02)
Je déteste qu'on cherche à me faire passer pour un con, j'y arrive déjà très bien tout seul.
Le mort, il sait pas qu'il est mort ; c'est pour les autres que c'est dur.................... Pour les cons, c'est pareil.
Hors ligne