Grep sur une ligne en renvoie plusieurs...Pourquoi?
Résolu
gnugo
-
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 :
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
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:
- Grep sur une ligne en renvoie plusieurs...Pourquoi?
- Partager photos en ligne - Guide
- Mètre en ligne - Guide
- Formulaire en ligne de meta - Guide
- Aller à la ligne excel - Guide
- Site de vente en ligne particulier - Guide
2 réponses
Salut,
Exemple :
Sinon.
C'est quoi ton système ? Parce que même avec ta syntaxe, chez moi ça marche ;-\
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
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.
Pas mieux :-( même avec un -m 1
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
Dans tes exemples tu fais un grep sur plusieurs lignesDans tes exemples tu fais un grep sur plusieurs lignesOups effectivement, le
-mne 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