Recherche de lignes avec find et grep

Résolu
razuki Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   -  
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   -
Bonjour,
je cherche depuis un moment la commande qui permet d'obtenir une ligne contenant l'expression1 mais ne contenant pas l'expression2.
Un find /mon_rep/ -name "mon_fic" | xargs grep "expression1" affiche des expression1 du type :
error: blablabla expression1 bliblibli expression2
mais ce que je cherche en fait c'est qu'il affiche uniquement les lignes contenant expression1, soit :
error: blablabla expression1 bliblibli.

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

2 réponses

mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
Si j'ai bien compris :

grep -nr expr1 /mon/rep | grep -v expr2


Le premier grep fouille dans l'arborescence /mon/rep. La seconde filtre le résultat du premier grep et vire toutes les lignes contenant expr2. À noter que expr1 et expr2 sont en réalité des expressions régulières. Pour plus de détails sur ce que c'est et comment ça fonctionne :

man grep


Si tu veux filtrer les messages d'erreur, attention, un pipe | ne mouline que le flux écrit dans la sortie standard (stdout) et pas dans stderr. Si tu veux masquer les erreurs, il suffit de rediriger ce flux dans /dev/null. Vu que seul le premier grep est susceptible d'écrire des erreurs, on effectue la redirection à son niveau (mais a priori on pourrait en mettre une en place pour le 2nd grep également) :

grep -nr expr1 /mon/rep 2> /dev/null | grep -v expr2


Bonne chance
2
dna.factory Messages postés 26003 Date d'inscription   Statut Modérateur Dernière intervention   1 618
 
pas mieux..
(ça fait quoi le -nr ? parce que je l'utilise jamais)
0
mamiemando Messages postés 33772 Date d'inscription   Statut Modérateur Dernière intervention   7 882
 
man grep :)
0
razuki Messages postés 242 Date d'inscription   Statut Membre Dernière intervention   1
 
après un man grep :
n : c'est pour afficher le numero de ligne
r : pour une recherche recursive dans le repertoire en question.
0