Forum Programmation.shell filtre avec awk

Posté par  .
Étiquettes : aucune
0
10
déc.
2009
Bonjour,

Je filtre un fichier de log avec la commande suivante :


awk '/TIMESTAMP/ || /IN/ || /OUT/ {print}' fichier.log > fichier.out


J'aimerai que le fichier commence au premier TIMESTAMP. Actuellement, j'efface les premières ligne IN et OUT à la main.
  • # Peux-tu etre plus clair STP ?

    Posté par  . Évalué à 2.

    Je ne comprends pas trop ce que tu veux faire ...
    Tu veux uniquelent les lignes contenant TIMESTAMP ET (IN ou out) ?

    awk ' /TIMESTAMP/ && (/IN/ || /OUT)'

    De mémoire, pas besoin de print ....
    • [^] # Re: Peux-tu etre plus clair STP ?

      Posté par  . Évalué à 2.

      erreur :

      awk ' /TIMESTAMP/ && (/IN/ || /OUT/)'
    • [^] # Re: Peux-tu etre plus clair STP ?

      Posté par  . Évalué à 1.

      En effet, il est très important de garder les TIMESTAMP mélangés au IN et OUT sinon je n'ai pas les dates seulement les heures.
      • [^] # Re: Peux-tu etre plus clair STP ?

        Posté par  . Évalué à 2.

        C'est à dire ?
        1/ Timestamp, In et out sur la même ligne ?
        2/ ligne contenant Timestamp, ET lignes contenant In et Out, en commencant par la première ligne Timestamp ?

        Si c'est 2, voir plus bas.
  • # utiliser une variable

    Posté par  . Évalué à 2.

    tu peux t'arranger en utilisant une variable. En pseudo-code (ou pas, je connais pas awk) :

    /timestamp/ {print; var=1 }
    var == 1 && (/in/ || /out/) {print}
    • [^] # Re: utiliser une variable

      Posté par  . Évalué à 1.

      Oui c'est bon ... je ne résiste plus
      • [^] # Re: utiliser une variable

        Posté par  . Évalué à 5.

        En bonus, parce que sed c'est dien :

        sed -n '/TIMESTAMP/{
        p
        h
        }
        /IN\|OUT/{
        x
        /^$/ {
        x
        be
        }
        x
        p
        }
        :e'

        On se sert du "hold space" de sed. Si on voit ligne timestamp, on met quelque chose dedans (commande "h"). Tant qu'il n'y a pas eu de timestamp, le hold space est vide.
        Quand on voit IN|OUT, on teste s'il contient quelque chose (les tests ne peuvent pas se faire sur le hold space, donc on échange ("x") avant. S'il est vide, on sort, sinon on affiche.
        • [^] # Re: utiliser une variable

          Posté par  . Évalué à 3.

          ton script m'a fait farfouiller le man =)

          On peut le raccourcir un tout petit peu en omettant le label, puisque d'après le man (et confirmé par mes tests), lorsqu'il est omis, ça branche en fin de script.

          Sinon, avec sed, on peut aussi travailler par bloc de lignes (pas seulement en ligne à ligne), et ça permet de simplfier :

          sed -n '/TIMESTAMP/,/OUT/{
          /IN\|OUT\|TIMESTAMP/{
          p
          }
          }' /path/to/file


          à noter que dans ces deux versions, on affiche le début du dernier bloc TIMESTAMP/IN/OUT même s'il est incomplet.
          • [^] # Re: utiliser une variable

            Posté par  . Évalué à 3.

            et en élaborant encore un peu (pour couper les blocs incomplets en fin de fichier, même si ce n'était pas demandé) :

            sed -n '/TIMESTAMP/,/OUT/{
            /TIMESTAMP/ { h }
            /IN/ { H }
            /OUT/ {
            H
            x
            p
            }
            }' ./path/to/file


            a y est, je suis fan du hold space :)
            • [^] # Re: utiliser une variable

              Posté par  . Évalué à 2.

              Bien joué ;)
              • [^] # Re: utiliser une variable

                Posté par  . Évalué à 2.

                ;-)
                sur ce coup là, je n'aurais pas pu écrire ça sans ton commentaire.

                Le hold space, c'est le genre de trucs ou on se demande après coup comment on a pu passer à côté si longtemps ...
                Je compte plus le nombre de trucs que j'ai appris sur programmation.shell, je l'aime bien ce forum :)

Suivre le flux des commentaires

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