Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

[ShellScript] Grep particulier

6 réponses
Avatar
donutman
Bonjour =E0 tous,

voil=E0 j'ai un fichier de donn=E9es de la forme suivante :

"
=2E..
toto : 1
tata : 15
titi : 30
toto : 12
tata : 3
titi : 21
=2E.."

J'aimerai faire un grep qui ne me retournerait que les valeurs
associ=E9es =E0 "toto" (ici : 1 et 12)

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

J'aimerais avoir comme r=E9sultat :
"1
12"

Savez-vous comment je pourrais proc=E9der ?

Merci d'avance

Donut

6 réponses

Avatar
Stephane CHAZELAS
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

Avatar
donutman
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


Avatar
Cyrille Lefevre
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.



Avatar
Stephane CHAZELAS
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

Avatar
Cyrille Lefevre
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.

Avatar
Stephane CHAZELAS
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