IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes GNU Discussion :

GREP : sortir les noms des fichiers contenant un mot A mais ne contenant pas un mot B


Sujet :

Shell et commandes GNU

  1. #1
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut GREP : sortir les noms des fichiers contenant un mot A mais ne contenant pas un mot B
    Bonjour,

    Je cherche a faire un grep qui me permet de sortir les noms des fichiers contenant un mot A mais ne contenant pas un mot B.

    Exemple
    Fichier 1 --> motA
    Fichier 2 --> motA motB
    Fichier 3 --> motB

    Résultat voulu

    Fichier 1

    Bon j'ai essayé pas mal de grep mais n'ai pas trouvé la solution.

    Je sais que grep -l motA * permet de récupérer les noms des fichiers mais impossible d'enlever les fichiers qui contiennent le deuxième mot...

    Savez-vous si c'est faisable ?

    Merci !!

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat > fic1
    motA
    $ cat > fic2
    motA motB
    $ cat > fic3
    motB
    $ awk '/motA/&&!/motB/{print FILENAME; nextfile}' fic*
    fic1
    ...
    ?
    ça ne fonctionnera certainement pas tel quel sur les vrais fichiers.

  3. #3
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 100
    Points : 28 397
    Points
    28 397
    Par défaut
    Si motA et motB ne sont pas sur la même ligne, il faut le faire en deux passages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep -q motB ${fic} || echo ${fic} ; done

  4. #4
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par al1_24 Voir le message
    Si motA et motB ne sont pas sur la même ligne, il faut le faire en deux passages

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep -q motB ${fic} || echo ${fic} ; done
    Effectivement les mots ne sont pas dans les mêmes lignes.

    Par contre au niveau du code, il me met une erreur à cause du -q qu'il dit ne pas connaitre.

    grep: illegal option -- q
    Usage: grep -hblcnsviw pattern file . . .
    Quelle est cette option exactement ?

  5. #5
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,

    Pour reprendre l'idée de al1_24 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep -l -v motB ${fic} ; done

  6. #6
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat > fic1
    motA
    $ cat > fic2
    motA motB
    $ cat > fic3
    motB
    $ awk '/motA/&&!/motB/{print FILENAME; nextfile}' fic*
    fic1
    ...
    ?
    ça ne fonctionnera certainement pas tel quel sur les vrais fichiers.
    J'ai bien essayé mais cela ne marche pas, j'ai l'erreur suivante :
    awk: can't open fic*
    Faut-il remplacer fic* par un nom de fichier ? Car cela non plus ne fonctionnait pas.

  7. #7
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Je n'ai peut-être pas compris le problème initial mais s'il y a un nom de fichier par ligne et que l'on souhaite ne conserver que ceux qui contiennent « motA » sans contenir « motB », un simple :

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    $ grep motA fichier.txt | grep -v motB

    … ne suffirait-il pas ?

  8. #8
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Salut,

    Pour reprendre l'idée de al1_24 :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep -l -v motB ${fic} ; done
    Merci mais cela ne fonctionne pas non plus, en effet sur mon exemple il me sort trois fichiers alors qu'il ne devrait pas en sortir.

    Il me semble que c'est normal car c'est des contrôles ligne par ligne...

  9. #9
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Le contenu du répertoire :
    Le contenu des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ head f*
    ==> f1 <==
    motA
     
    ==> f2 <==
    motA motB
     
    ==> f3 <==
    motB
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ for fic in $(grep -l motA *) ; do grep -l -v motB ${fic} ;done
    f1
     
    $

  10. #10
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 584
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 584
    Points : 19 461
    Points
    19 461
    Par défaut
    bien sûr, il faut adapter en fonction des noms de tes fichiers.

  11. #11
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 100
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 63
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Retraité
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 100
    Points : 28 397
    Points
    28 397
    Par défaut
    L'option -q de grep supprime tout affichage. Le code retour de la commande est utilisé pour identifier si la chaine a été trouvée ($? == 0) ou non ($? != 0).

    Je pensais que c'était une option standard parce que je l'ai rencontrée sur tous les environnements que j'ai utilisés (AIX, solaris, System V, UWIN, Cygwin)

  12. #12
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je n'ai peut-être pas compris le problème initial mais s'il y a un nom de fichier par ligne et que l'on souhaite ne conserver que ceux qui contiennent « motA » sans contenir « motB », un simple :

    Code Shell :
    Sélectionner tout - Visualiser dans une fenêtre à part
    $ grep motA fichier.txt | grep -v motB


    … ne suffirait-il pas ?
    Lorsque que j'exécute cette comment il me sort les lignes où seul motA apparait. Je l'ai légèrement modifiée afin d'avoir seulement le nom des fichiers en sortie et me retrouve avec résultat : <stdin>

    Je ne sais pas à quoi ça correspond ? Est-ce que cela veut dire qu'aucun fichier est en sortie ?

  13. #13
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Le contenu du répertoire :
    Le contenu des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ head f*
    ==> f1 <==
    motA
     
    ==> f2 <==
    motA motB
     
    ==> f3 <==
    motB
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ for fic in $(grep -l motA *) ; do grep -l -v motB ${fic} ;done
    f1
     
    $

    Cela ne fonctionne pas chez moi.

    A préciser que les deux mots ne sont pas forcément dans la même ligne !!

    Citation Envoyé par N_BaH Voir le message
    bien sûr, il faut adapter en fonction des noms de tes fichiers.
    Lorsque je met un nom de fichier j'ai l'erreur suivante :
    awk: illegal statement 776470
    Je suis en train de chercher à quoi cela correspond...

  14. #14
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Septembre 2007
    Messages
    7 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 393
    Points : 23 740
    Points
    23 740
    Par défaut
    Je viens de relire ton post initial. On est bien d'accord, tu cherches à obtenir la liste des fichiers dont le nom contient motA mais pas motB, complètement indépendant du contenu de ces fichiers, n'est-ce pas ?

    Que donne

    Code Shell : Sélectionner tout - Visualiser dans une fenêtre à part
    $ find | grep motA | grep -v motB

    … dans un shell ?

    Lorsque que j'exécute cette comment il me sort les lignes où seul motA apparait.
    Et ce n'est pas ce que tu veux ?

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par lola06 Voir le message
    Bonjour,

    Je cherche a faire un grep qui me permet de sortir les noms des fichiers contenant un mot A mais ne contenant pas un mot B.

    Exemple
    Fichier 1 --> motA
    Fichier 2 --> motA motB
    Fichier 3 --> motB

    Résultat voulu

    Fichier 1
    Une fois de plus, il me semble que les spécifications ne sont pas suffisamment précises.
    Et l'exemple fourni est trop spécifique!

    Je voudrais vérifier si j'ai bien compris ce que tu veux faire:

    Tu as une liste de fichiers.
    Chaque fichier peut contenir une ou plusieurs lignes.
    Chaque ligne peut contenir ou non le motA.
    Chaque ligne peut contenir ou non le motB.
    Tu veux trouver, parmi tous les fichiers, le nom de ceux dont au moins une ligne contient le motA mais dont aucune ligne ne contient le motB.
    C'est-à-dire aussi trouver le nom de tous les fichiers dont au moins une ligne contient le motA, mais en éliminant tous ceux dont au moins une ligne contient le motB.

    Est-ce bien ça?

    Si oui, grep -l -v motB ne va pas, car ça n'élimine pas un fichier dont au moins une ligne contient le motB; ça élimine un fichier dont toutes les lignes contiennent le motB.

    Évidemment, avec des exemples de fichiers à une seule ligne, il est très difficile de faire la différence entre "au moins une ligne" et "toutes les lignes"!!!

    Si "mes" spécs sont bonnes, je repartirais bien de la solution de al1_24 (en remplaçant -q par ce qu'elle veut dire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep motB ${fic} > /dev/null || echo ${fic} ; done
    Et peux-tu nous dire quel est cet environnement bizarre où grep n'admet pas -q ???

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Points : 5 851
    Points
    5 851
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je viens de relire ton post initial. On est bien d'accord, tu cherches à obtenir la liste des fichiers dont le nom contient motA mais pas motB, complètement indépendant du contenu de ces fichiers, n'est-ce pas ?
    ÀMHA, c'est le contraire! Elle teste le contenu, mais veut sortir le nom!

    Lorsque que j'exécute cette comment il me sort les lignes où seul motA apparait.
    Et ce n'est pas ce que tu veux ?
    Le titre de la discussion est explicite: elle veut sortir le nom des fichiers, et non pas sortir les lignes!

  17. #17
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par Obsidian Voir le message
    Je viens de relire ton post initial. On est bien d'accord, tu cherches à obtenir la liste des fichiers dont le nom contient motA mais pas motB, complètement indépendant du contenu de ces fichiers, n'est-ce pas ?

    Que donne

    Code Shell :
    Sélectionner tout - Visualiser dans une fenêtre à part
    $ find | grep motA | grep -v motB
    … dans un shell ?

    Et ce n'est pas ce que tu veux ?
    Non pas exactement, je veux les noms des fichiers qui ont une ligne avec un motA et auncune ligne avec le motB

    Citation Envoyé par jack-ft Voir le message
    Une fois de plus, il me semble que les spécifications ne sont pas suffisamment précises.
    Et l'exemple fourni est trop spécifique!

    Je voudrais vérifier si j'ai bien compris ce que tu veux faire:

    Tu as une liste de fichiers.
    Chaque fichier peut contenir une ou plusieurs lignes.
    Chaque ligne peut contenir ou non le motA.
    Chaque ligne peut contenir ou non le motB.
    Tu veux trouver, parmi tous les fichiers, le nom de ceux dont au moins une ligne contient le motA mais dont aucune ligne ne contient le motB.
    C'est-à-dire aussi trouver le nom de tous les fichiers dont au moins une ligne contient le motA, mais en éliminant tous ceux dont au moins une ligne contient le motB.

    Est-ce bien ça?

    Si oui, grep -l -v motB ne va pas, car ça n'élimine pas un fichier dont au moins une ligne contient le motB; ça élimine un fichier dont toutes les lignes contiennent le motB.

    Évidemment, avec des exemples de fichiers à une seule ligne, il est très difficile de faire la différence entre "au moins une ligne" et "toutes les lignes"!!!

    Si "mes" spécs sont bonnes, je repartirais bien de la solution de al1_24 (en remplaçant -q par ce qu'elle veut dire):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    for fic in $(grep -l motA *) ; do grep motB ${fic} > /dev/null || echo ${fic} ; done
    Et peux-tu nous dire quel est cet environnement bizarre où grep n'admet pas -q ???
    J'ai très certainement trop simplifié mon exemple. Tes spécifications sont exactes.

    Ton code marche parfaitement, merci beaucoup !!!

    Merci aussi aux autres qui ont participé.

    Pour l'environnement, comment je fais pour avoir les informations ?

  18. #18
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Histoire d'éviter une boucle...

    Le contenu des fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ head f*
    ==> f1 <==
    blabla
    motA
    blabla
     
    ==> f2 <==
    blabla
    motA blabla
    blabla
    motB
    blabla
     
    ==> f3 <==
    blabla
    blabla motB
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -Zl "motA" f* | xargs -0 grep -L "motB"
    f1
     
    $

  19. #19
    Membre émérite Avatar de lola06
    Femme Profil pro
    Consultante en Business Intelligence
    Inscrit en
    Avril 2007
    Messages
    1 316
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Âge : 37
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultante en Business Intelligence
    Secteur : Service public

    Informations forums :
    Inscription : Avril 2007
    Messages : 1 316
    Points : 2 520
    Points
    2 520
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ grep -Zl "motA" f* | xargs -0 grep -L "motB"
    f1
     
    $
    Malheureusement ceci me renvoie les erreurs suivantes :

    grep: illegal option -- Z
    Usage: grep -hblcnsviw pattern file . . .
    xargs: illegal option -- 0
    xargs: Usage: xargs: [-t] [-p] [-e[eofstr]] [-E eofstr] [-I replstr] [-i[replstr]] [-L #] [-l[#]] [-n # [-x]] [-s size] [cmd [args ...]]ID

  20. #20
    Expert éminent

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Points : 6 276
    Points
    6 276
    Par défaut
    Sur quel système/distrib tournes-tu ?

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

Discussions similaires

  1. Les accents sur les noms des fichiers passent mal
    Par fab53 dans le forum Langage
    Réponses: 3
    Dernier message: 04/01/2008, 15h05
  2. Stocker les nom des fichiers d'un type d'un repértoire
    Par Bloodscalp dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 12/09/2006, 14h26
  3. fonction qui met en liste les noms des fichiers
    Par aliassaf dans le forum Général Python
    Réponses: 2
    Dernier message: 22/06/2006, 11h50
  4. Ecrire les noms des fichiers dans une colonne
    Par REGIMBAL dans le forum Access
    Réponses: 1
    Dernier message: 20/04/2006, 11h29
  5. ShellListView : comment récupérer les noms des fichiers?
    Par Lolo1988 dans le forum Composants VCL
    Réponses: 1
    Dernier message: 11/12/2005, 23h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo