Forum Programmation.shell Bash et les champs

Posté par  .
Étiquettes : aucune
0
15
sept.
2005
bonjour,


Je resouleve un probleme...

j'ai un fichier de type:


deck1 poum2 deck54 plough4
deck1 deck2 poum3 mouet4 etc.


Je voudrais pouvoir faire un "grep" sur un champs, genre,

grep fichier "* * deck54 *"

pour qu'il retourne le contenu de la ligne.

Hors, quand je fais ça, le "grep" agit sur tout les champs.
Quelle est la solution pour qu'il agisse sur un seul champs...?
(separé par des tabulations)

Il faut que se soit en bash, bien entendu...!

merci d'avance
  • # idée

    Posté par  . Évalué à 4.

    cut -d" " -f3 (pour avoir le 3ème champ) | grep

    ou grep -e "expression régulière qui sélectionne ton 3ème champ"
    • [^] # Re: idée

      Posté par  . Évalué à 3.

      Merci, mais je voudrais que le retour de la commande soit la
      ligne entiere, et pas juste le 3em champs...

      donc si je fais "grep deck 54", le retour serait:

      deck1 poum2 deck54 plough4
    • [^] # Re: idée

      Posté par  . Évalué à 4.

      La deuxième version est probablement meilleure parce que cut va extraire le champ de la ligne avant de l'envoyer à grep et l'utilisateur ne peut donc plus récupérer le contenu intégral.

      grep -e "^[^\t]*\t[^\t]*\tdeck54\t" devrait fonctionner si la syntaxe est les caractères échapés ne le perturbent pas trop.
  • # awk

    Posté par  . Évalué à 4.

    c'est pas du shell, mais awk fait ça super bien

    $ awk < file ' $3~/deck54/'

    $3, c'est pour comparer sur le troisième champ (comme dans ton exemple)
    et print $0 (affichage de la ligne) est l'action par défaut.
    • [^] # Re: awk

      Posté par  . Évalué à 1.

      Cut et grep non plus ce n'est pas du shell bash !

      Sinon tu as raison awk fait ça très bien, on peut ommetre le $0 :
      awk '$3~/deck54/ {print}' < file
    • [^] # Re: awk

      Posté par  . Évalué à 2.

      ça marche super, en plus c'est super simple...!

      Par contre il est case-sensitive...

      J'aimerais bien qu'il ne fasse pas la difference entre les majuscules
      et les minuscule... Je planche, si quelqu'un a la soluce...
      • [^] # Re: awk

        Posté par  . Évalué à 2.

        man awk ! :)

        Je te laisse faire joujou avec tolower et toupper. Plutôt toupper en fait, ça t'évitera des problèmes d'accent.

        Sinon, tu peux aussi remplacer /deck54/ par /[dD][eE][cC][kK]54/ puisqu'il s'agit d'une regex, mais c'est plus long et nettement moins drole à utiliser :)
        • [^] # Re: awk

          Posté par  . Évalué à 2.

          ba j'ai regarder touuper et tolower, mais j'ai pas eu trop le temps,
          je regarde et je te dis...!
        • [^] # Re: awk

          Posté par  . Évalué à 2.

          sinon je vois une variable IGNORECASE

          Mais comment on utilise se genre de variable...?

          awk -v IGNORECASE=0 etc...?



          Et tolower, ça s'utilise du genre:
          awk '$4~/tolower 'guerin'/' /apache/base/*/*

          Bouh je cherche, je cherche...
          • [^] # Re: awk

            Posté par  . Évalué à 2.

            awk 'BEGIN { print tolower(les mots a changer) }'

            Bon, ça c'est bon, mais maintenant je n'arrive pas
            a modifier la sortie d'une commande...

            du cat genre:

            cat foo.text | awk 'BEGIN { print tolower() }'...

            je cherche, je cherche ...! :)
          • [^] # Re: awk

            Posté par  . Évalué à 2.

            ouaip, pas loin Mais en l'occurence, le tolower (ou le toupper), tu veux l'appliquer à la donnée de ton fichier, et pas à la valeur en dur de référence. Ce serait plutôt

            awk 'tolower($4) ~/machin/'

            Sinon, je connaissais pas IGNORECASE. Ca a l'air bien aussi. A priori, d'après la doc, il faut que tu le positionnes à autre chose que 0 pour ignore la casse.
            Ca serait donc plutot
            awk -v IGNORECASE=1 '(...)'

            Contrairement à mes posts précédents, j'ai pas testé ce que je dis là. C'est direct tiré de la doc. A vérifier donc :)
            • [^] # Re: awk

              Posté par  . Évalué à 2.

              Merci de ton aide, vraiment tu m'a bien fais avancer...!

              j'ai trouvé ça,
              cat /apache/base/*/* | awk '{ print tolower ($0) }' | awk -F "\t" '$4~/'$var'/'

              ça marche super.

              Je te remercie encore...!

Suivre le flux des commentaires

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