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 24/11/2018, à 15:17

LinuxerQuelconque

Pourquoi est-ce que mon script marche et comment l’accélérer ?

Bonjour big_smile,

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 smile

Dernière modification par LinuxerQuelconque (Le 24/11/2018, à 15:19)

Hors ligne

#2 Le 24/11/2018, à 15:37

bruno

Re : Pourquoi est-ce que mon script marche et comment l’accélérer ?

Bonjour,

ps aux | tr -s ' '

Hors ligne

#3 Le 24/11/2018, à 15: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, à 15: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. big_smile big_smile big_smile

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, à 15: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, à 15: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 cool

Dernière modification par LinuxerQuelconque (Le 24/11/2018, à 15:53)

Hors ligne

#6 Le 24/11/2018, à 16: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, à 19: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, à 20: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