Forum Programmation.shell Grep -v d'une liste

Posté par  .
Étiquettes : aucune
0
4
juin
2007
Bonjour,

Je sais que grep peut capturer une liste en tapant :

grep 'mot1, mot2, mot3' fichier1 fichier2

Mais peut t-il faire la même chose avec l'option -v ?

En tout cas moi je n'y arrive pas
grep -v 'mot1, mot2, mot3' fichier1

Avec ou sans l'option -v

Merci de votre aide
  • # Euh...

    Posté par  . Évalué à 2.

    Je ne vois pas trop ce que tu veux dire par "capturer une liste". Dans ton exemple, je comprends chopper soit mot1, soit mot2, soit mot3, mais si c'est les mots d'affilée ou dans n'importe quel sens la solution que je propose est adaptable.

    D'ailleurs, je sais pas que grep fait ce que tu dis (vu que je vois pas ce que tu dis ;P).

    Mais ce que je sais qu'il fait, dans sa variante egrep, c'est interpréter sans problème les expressions régulières.

    D'où le :

    egrep -v "^.*(mot1|mot2|mot3).*$" fichier1 fichier2

    Avec ou sans -v, ça marche.
    • [^] # Re: Euh...

      Posté par  . Évalué à 1.

      pourquoi les .* avant et apres l'expression? Ils me semble que c'(est inutile.
  • # oui, il peut

    Posté par  . Évalué à 2.

    grep -v 'mot1\|mot2\|mot3' fichier1, ça doit le faire

    on ne peut pas passer plusieurs options -v à grep, il faut donc se débrouiller pour construire *la* regex qui gère d'un seul coup tous les motifs que tu veux exclure.
    • [^] # Re: oui, il peut

      Posté par  (site web personnel) . Évalué à 2.

      Sinon il suffit tout simplement d'utiliser plusieurs fois grep:

      cat fichier | grep -v mot1 | grep -v mot2 | grep -v mot3
      • [^] # Re: oui, il peut

        Posté par  . Évalué à 1.

        Oui mais la commande suivante :
        cat fichier | grep -v mot1 | grep -v mot2 | grep -v mot3

        a ses limites jusqu' a que le shell me signale qu'il ne trouve plus la commande grep car il y a trop de pipe.....

        Merci de vos réponse
        • [^] # Re: oui, il peut

          Posté par  . Évalué à 1.

          oui, on peut aussi faire du grep | grep | grep ...
          par contre, le cat ne sert à rien. D'ailleurs, globalement, tout usage de cat dans un script ou dans une succession de commande est probablement inutile :-)

          sinon, tu peux aussi demander à grep de lire les motifs à partir d'un fichier.
          Je viens de tester, et les options -f et -v sont compatibles.
          • [^] # Re: oui, il peut

            Posté par  . Évalué à 4.

            et l'option "-e" alors ?

            grep -v -e "mot1" -e "mot2" -e "mot3" fichier1

            • [^] # Re: oui, il peut

              Posté par  . Évalué à 1.

              je te plussoie tout ce que je peux (de 1 donc ;-)
            • [^] # Re: oui, il peut

              Posté par  . Évalué à 1.

              Moi je vote pour l'option -v accompagnée de l'option -e
              :)

              Encore merci de votre aide
              • [^] # Re: oui, il peut

                Posté par  . Évalué à 1.

                grep -v 'mot1\|mot2\|mot3' fichier1

                Fonctionne aussi tres bien
                • [^] # Re: oui, il peut

                  Posté par  . Évalué à 1.

                  awk '!/mot1|mot2|mot3/' ou awk '/mot1|mot2|mot3/' le fait aussi.
                  • [^] # Re: oui, il peut

                    Posté par  . Évalué à 2.

                    Le soucis c'est que trop pipe tue le pipe ....

                    awk '!/mot1|mot2|mot3/' | sort
                    J4ai le message d'erreur suivant :
                    bash:  sort : commande introuvable

                    Apparement le PATH du bash explose même en faisant
                    awk '!/mot1|mot2|mot3/' | /usr/bin/./sort
                    bash:  /usr/bin/./sort: Aucun fichier ou répertoire de ce type

                    Je reste donc sur ma preference de grep avec l'option -v accompagnée de -e ...

                    Merci pour tout
                    • [^] # Re: oui, il peut

                      Posté par  . Évalué à 1.

                      Je comprend pas ....
                      en sh :

                      # cat toto
                      mot1
                      mot2
                      mot4
                      mot6

                      # awk '!/mot1|mot2|mot3/' toto | sort
                      mot4
                      mot6

                      en bash:

                      bash-2.05# awk '!/mot1|mot2|mot3/' toto | sort
                      mot4
                      mot6

                      Ou est le probleme ?
                      • [^] # Re: oui, il peut

                        Posté par  . Évalué à 1.

                        Sur ce point on a la même question :)

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.