[ShellScript] Grep particulier

Le
donutman
Bonjour à tous,

voilà j'ai un fichier de données de la forme suivante :

"

toto : 1
tata : 15
titi : 30
toto : 12
tata : 3
titi : 21
"

J'aimerai faire un grep qui ne me retournerait que les valeurs
associées à "toto" (ici : 1 et 12)

Si je fais "grep 'toto' data.dat" j'obtiens :
"toto : 1
toto : 12"

J'aimerais avoir comme résultat :
"1
12"

Savez-vous comment je pourrais procéder ?

Merci d'avance

Donut
Vidéos High-Tech et Jeu Vidéo
Téléchargements
Vos réponses
Gagnez chaque mois un abonnement Premium avec GNT : Inscrivez-vous !
Trier par : date / pertinence
Stephane CHAZELAS
Le #6869461
2008-06-10, 07:08(-07), :
[...]
toto : 1
tata : 15
titi : 30
toto : 12
tata : 3
titi : 21
..."

J'aimerai faire un grep qui ne me retournerait que les valeurs
associées à "toto" (ici : 1 et 12)

Si je fais "grep 'toto' data.dat" j'obtiens :
"toto : 1
toto : 12"

J'aimerais avoir comme résultat :
"1
12"

Savez-vous comment je pourrais procéder ?
[...]


awk '$1 == "toto" {print $3}'

ou

sed -n 's/^toto[[:blank:]]*:[[:blank:]]*//p'


--
Stéphane

donutman
Le #6871351
On 10 juin, 16:19, Stephane CHAZELAS wrote:
2008-06-10, 07:08(-07), :
[...]
Si je fais "grep 'toto' data.dat" j'obtiens :
"toto : 1
toto : 12"

J'aimerais avoir comme résultat :
"1
 12"

Savez-vous comment je pourrais procéder ?


[...]

awk '$1 == "toto" {print $3}'

ou

sed -n 's/^toto[[:blank:]]*:[[:blank:]]*//p'

--
Stéphane- Masquer le texte des messages précédents -

- Afficher le texte des messages précédents -



Ok je ne connaissais pas du tout ces commandes, ça marche impec !
Merci beaucoup !


Donut


Cyrille Lefevre
Le #6896711
On 10 juin, 16:19, Stephane CHAZELAS wrote:
2008-06-10, 07:08(-07), :
[...]
Si je fais "grep 'toto' data.dat" j'obtiens :
"toto : 1
toto : 12"
J'aimerais avoir comme résultat :
"1
12"
Savez-vous comment je pourrais procéder ?
[...]


awk '$1 == "toto" {print $3}'

ou

sed -n 's/^toto[[:blank:]]*:[[:blank:]]*//p'



Bonjour,

il y a aussi :

while read var colon value; do
case ${var} in
'toto') echo "${value}" ;;
esac

ou

if [[ ${var} = 'toto' ]]; then
echo "${value}"
fi

mais encore :

[[ ${var} = 'toto' ]] && echo "${value}"
done < fichier

les puristes te dirons de remplacer echo par : printf "%sn" "${value}"
en ksh, il y a aussi : print -r -- "${value}"
qui a l'avantage d'être une builtin, ce qui n'est pas toujours le cas d e
printf.

d'autres puristes te dirons aussi que [[... ]] n'est pas portable et
qu'il faut écrite [ "${var}" = 'toto' ], mais ça me gonfle de quote r
toutes les variables inutilement dans ce contexte car ça rend la lectur e
plus lourde...

Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.



Stephane CHAZELAS
Le #6913741
2008-06-11, 02:52(+02), Cyrille Lefevre:
[....]
il y a aussi :

while read var colon value; do
case ${var} in
'toto') echo "${value}" ;;
esac

ou

if [[ ${var} = 'toto' ]]; then
echo "${value}"
fi

mais encore :

[[ ${var} = 'toto' ]] && echo "${value}"
done < fichier

les puristes te dirons de remplacer echo par : printf "%sn" "${value}"
en ksh,


pas seulement en ksh.

il y a aussi : print -r -- "${value}"
qui a l'avantage d'être une builtin, ce qui n'est pas toujours le cas de
printf.

d'autres puristes te dirons aussi que [[... ]] n'est pas portable et
qu'il faut écrite [ "${var}" = 'toto' ], mais ça me gonfle de quoter
toutes les variables inutilement dans ce contexte car ça rend la lecture
plus lourde...
[...]


[ toto = "$var" ] est plus court et portable.

Maintenant, d'autres puristes te diront qu'executer 3 ou 4
commandes pour chaque ligne d'un fichier n'est pas tres elegant
(et inefficace) comparé a juste une commande sed ou une commande
awk ou encore que "read" sans "-r" fait un traitement
particulier des backslashs (mais de toute facon l'emploi d'echo
fait que les backslashs poseront probleme anyway).

--
Stéphane

Cyrille Lefevre
Le #6991901
Maintenant, d'autres puristes te diront qu'executer 3 ou 4
commandes pour chaque ligne d'un fichier n'est pas tres elegant
(et inefficace) comparé a juste une commande sed ou une commande
awk ou encore que "read" sans "-r" fait un traitement
particulier des backslashs (mais de toute facon l'emploi d'echo
fait que les backslashs poseront probleme anyway).


tu as raison, j'avais oublié le -r.

pour autant :

$ wc toto
37554 112662 337986 toto

# bash 3.2.33 (cygwin) avec echo (-e ou -E ne change rien !)
$ cat x
while read -r var colon value; do
[[ ${var} = 'toto' ]] && echo -E "${value}"
done < toto
$ time ./x > /dev/null

real 0m16.928s
user 0m4.320s
sys 0m12.213s

# bash avec printf "%sn" "${var}"
$ time ./x > /dev/null

real 0m11.491s
user 0m2.995s
sys 0m9.219s

# pdksh 5.2.14 (cygwin)
$ cat x
while read -r var colon value; do
[[ ${var} = 'toto' ]] && print -r -- "${value}"
done < toto
$ time ./x > /dev/null

real 0m3.190s
user 0m0.405s
sys 0m2.729s

# ksh88 from irix (cygwin)
$ time ./x > /dev/null

real 0m0.327s
user 0m0.233s
sys 0m0.077s

# ksh93s (cygwin)
$ time ./x > /dev/null

real 0m0.366s
user 0m0.265s
sys 0m0.062s

# zsh 4.3.4 (cygwin)
$ time ./x > /dev/null

real 0m13.314s
user 0m2.479s
sys 0m11.014s

# gawk 3.1.6 (cygwin)
$ time awk '$1 == "toto" {print $3}' toto > /dev/null

real 0m0.438s
user 0m0.093s
sys 0m0.093s

# gsed 4.1.5 (cygwin)
$ time sed -n 's/^toto[[:blank:]]*:[[:blank:]]*//p' toto > /dev/null

real 0m0.206s
user 0m0.078s
sys 0m0.062s

sed est pas mal, mais le ksh se défend bien par rapport à awk,
bash à la ramasse, comme d'hab, zsh pas beaucoup mieux, pdksh
un peu mieux.

Regards, Cordialement,

Cyrille Lefevre.
--
mailto:Cyrille.Lefevre-news%
supprimer "%nospam% et ".invalid" pour me repondre.
remove "%nospam" and ".invalid" to answer me.

Stephane CHAZELAS
Le #6993231
2008-06-13, 00:39(+02), Cyrille Lefevre:
[...]
sed est pas mal, mais le ksh se défend bien par rapport à awk,
bash à la ramasse, comme d'hab, zsh pas beaucoup mieux, pdksh
un peu mieux.
[...]


Ce qu'il faut regarder, c'est user+sys, real prend en compte le
temps passé a executer d'autres commandes sur le systeme.

Tu trouveras que les shells basé sur ash sont les plus rapides
dans ce genre d'exercice.

Je maintiens que les shells n'ont pas ete concus pour etre
utilisé comme ca.

--
Stéphane

Publicité
Poster une réponse
Anonyme