Grep sur une ligne en renvoie plusieurs...Pourquoi?

Résolu/Fermé
gnugo - 7 avril 2014 à 09:18
 gnugo - 7 avril 2014 à 12:52
Bonjour,

Après avoir relu la doc, j'ai du mal la comprendre vu ce qui se produit , mais je pensais que grep fonctionnait par ligne (par défaut) et donc s'arrêtait après avoir "matché" un résultat.

Pouvez-vous m'aider à comprendre le comportement de grep dans ce cas :
[me] $ echo "$b"
server.log.2014-564-52.s5.sfg.sdf
-(lun avr 07 09:08:33)--(localhost:~)-
[me] $ echo $b | grep -o '^[^\.]*\....'
server.log
.201
4-564-52.s5.
sfg.sdf

J'attendais uniquement "server.log" comme réponse. Là il me sort tout. Est-ce à cause du -o ?

PS : (question bonus :-)) Savez vous comment rendre un grep "non-gourmand" afin de récupérer correctement server.log dans mon exemple.



Merci d'avance pour votre aide
A voir également:

2 réponses

zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
7 avril 2014 à 09:31
Salut,

mais je pensais que grep fonctionnait par ligne (par défaut) et donc s'arrêtait après avoir "matché" un résultat.
Non, pour ça il y a l'option
-m x
, où x est le nombre d'occurrence à matcher.

Exemple :
$ echo -e "Tralala\nTrololo\nlala\ntralalère" | grep -n 'la'
1:Tralala
3:lala
4:tralalère

$ echo -e "Tralala\nTrololo\nlala\ntralalère" | grep -n -m 1 'la'
1:Tralala

$ echo -e "Tralala\nTrololo\nlala\ntralalère" | grep -n -m 2 'la'
1:Tralala
3:lala

Sinon.
$ echo "${A}"
server.log.2014-564-52.s5.sfg.sdf

$ grep -o '^[^.]*\.[^.]*' <<<${A}
server.log


C'est quoi ton système ? Parce que même avec ta syntaxe, chez moi ça marche ;-\
$ grep -o '^[^\.]*\....' <<<${A}
server.log

0
Je suis en Centos 5
Dans tes exemples tu fais un grep sur plusieurs lignes (echo -e ....\n....\n...) donc on a bien un résultat par ligne, pas plusieurs comme dans mon exemple.

[me] $ uname -a
Linux localhost 2.6.18-164.15.1.el5 #1 SMP Wed Mar 17 11:37:14 EDT 2010 i686 athlon i386 GNU/Linux
-(lun avr 07 10:01:33)--(localhost:~)-
[me] $ A="server.log.2014-564-52.s5.sfg.sdf"
-(lun avr 07 10:01:38)--(localhost:~)-
[me] $ echo ${A}
server.log.2014-564-52.s5.sfg.sdf
-(lun avr 07 10:01:46)--(localhost:~)-
[me] $ grep -o '^[^\.]*\....' <<<${A}
server.log
.201
4-564-52.s5.
sfg.sdf
-(lun avr 07 10:02:13)--(localhost:~)-
[me] $ grep -o '^[^\.]*\.[^.]*' <<<${A}
server.log
.2014-564-52
.s5
.sfg
.sdf
-(lun avr 07 10:02:42)--(localhost:~)-
[me] $ grep --version
grep (grep de GNU) 2.5.1

Pas mieux :-( même avec un -m 1
0
(En attendant je m'en sors avec un affreux " | head -1" sur mon grep mais bon ... c'est pas une solution)
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
7 avril 2014 à 11:09
Dans tes exemples tu fais un grep sur plusieurs lignesDans tes exemples tu fais un grep sur plusieurs lignes
Oups effectivement, le
-m
ne marche que sur les lignes et non les occurrences ;-[

Par contre, chez moi, avec ton exemple, j'ai bien qu'une seule occurrence qui sort ;-\

$ A='server.log.2014-564-52.s5.sfg.sdf'

$ grep -o '^[^.]*\.[^.]*' <<<${A}
server.log
0
zipe31 Messages postés 36402 Date d'inscription dimanche 7 novembre 2010 Statut Contributeur Dernière intervention 27 janvier 2021 6 418
7 avril 2014 à 11:11
Sinon essaye avec
sed
:

$ sed 's/^\([^.]*\.[^.]*\).*/\1/' <<<${A}
server.log
0
Merci pour le sed ! C'est plus propre que mon grep foireux | head -1

J'ai regardé dans mes variables d'environnement et dans mes alias, je n'ai rien vu de particulier.
Si vous avez une idée sur ce qui peut causer le comportement différent de mon grep, ça m'intéresse
0
J'ai essayé sur d'autres serveurs, j'ai toujours le même comportement
grep -o a. <<<"a1a2a3"
a1
a2
a3

Quelle est ta version grep ?
Y a -til d'autres personnes ont la même chose que moi ?
0