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

Résolu
gnugo -  
 gnugo -
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   Statut Contributeur Dernière intervention   6 430
 
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
gnugo
 
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
gnugo
 
(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   Statut Contributeur Dernière intervention   6 430
 
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   Statut Contributeur Dernière intervention   6 430
 
Sinon essaye avec
sed
:

$ sed 's/^\([^.]*\.[^.]*\).*/\1/' <<<${A}
server.log
0
gnugo
 
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
gnugo
 
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