Forum Programmation.shell Afficher un champ précis depuis un log

Posté par  .
Étiquettes : aucune
0
6
août
2009
Bonjour,

Dans mon log de Postfix, j'ai besoin d'afficher les adresses mails qui m'ont générés un bounce.
Bon un petit cat /var/log/mail/postfix | grep "status=bounced" fonctionne. Mais ça me retourne la ligne entière. J'aimerais afficher uniquement ce qu'il y a écrit entre "to=<" et ">", qui correspond au mail.

Au début, je voulais procéder avec un cut -d' ' -f7 ou un awk '{print $7'} mais le numéro du champ peut bouger des fois, et donc, je me retrouve avec un champ qui ne correspond à ce que je veux.

Je vois que sed/awk peuvent faire ça, mais je n'ai aucune idée du fonctionnement.

Si vous avez un exemple, ça serait parfait !

Merci beaucoup.
  • # Un exemple

    Posté par  . Évalué à 2.

    J'ai pas de postfix sous les pattes, post un exemple de ligne svp, ça m'aideras a t'aider :)
    • [^] # Re: Un exemple

      Posté par  . Évalué à 1.

      Jul 31 20:17:10 hostname postfix/smtp[18870]: A3A93889A: to=<username@yahoo.com>, relay=c.mx.mail.yahoo.com[216.39.53.3], delay=3871, status=bounced (host c.mx.mail.yahoo.com[216.39.53.3] said: 554 delivery error: dd Sorry your message to username@yahoo.com cannot be delivered. This account has been disabled or discontinued [#102]. - mta174.mail.re4.yahoo.com (in reply to end of DATA command))


      J'aimerais extraire la chaine username@uahoo.com. En gros, sortir la chaine après "to=<" et avant ">".

      Merci !
      • [^] # Re: Un exemple

        Posté par  . Évalué à 1.

        Avec gawk et les gensub :

        gawk -F"," '{$1=gensub("(.*)to=<(.*)@(.*)>","\\2@\\3",1,$1); if ($0 ~ "status=bounced") print $1}' /var/log/ton_fichier_postfix.log


        Mais c'est peut-être plus simple avec le "grep -o" mentionné dans les posts ci-dessous.
    • [^] # Re: Un exemple

      Posté par  . Évalué à 2.

      Ba j'arrive apres la guerre quoi, j'ai pu rien à faire :)
      • [^] # Re: Un exemple

        Posté par  . Évalué à 1.

        Je te rassure : moi aussi avec mon gawk je suis arrivé après la guerre... mais bon ça fait une alternative à "grep -o" !
        • [^] # Re: Un exemple

          Posté par  . Évalué à 2.

          Je vous rassure, c'est pas une guerre :)

          Et puis, plus y a de solutions proposées, mieux c'est (mon petit côté Perl ;)

          Sinon, c'est aussi possible de remplacer le syslog fichier par un syslog qui stocke en DB. Ensuite, trouver l'info de départ, c'est un simple SELECT dans la dite DB
          • [^] # Re: Un exemple

            Posté par  . Évalué à 3.

            Je vous rassure, c'est pas une guerre :)

            Tu dis ça parce que tu as gagné :)
  • # sed, grep, awk

    Posté par  . Évalué à 3.

    Effectivement, awk/sed sont les outils qu'on va assez vite dégainer pour traiter des flux de texte. Je suis tombé l'option -o de grep il y a peu de temps. Elle n'est pas portable mais si tu es sous Linux, ça serait dommage de se priver.

    $ echo "blablabla to=<addr1@machin.truc> bliblibli to=<addr2@truc.bidule>" > fichier
    $ grep -o "to=<\([^>]*\)>" fichier
    to=<addr1@machin.truc>
    to=<addr2@truc.bidule>


    Ensuite, yapuka (c) enlever les petits morceaux qui traînent avec l'outil de ton choix. Par exemple en pipant dans un sed du genre
    (...) | sed -e 's/to=<\(.*\)>/\1/'


    En sed pur, on peut aussi faire des trucs, mais c'est un peu moins lisible, et la solution que j'ai ne peut traiter qu'une seul adresse par ligne (ce qui à priori n'est pas trop grave pour ton cas mais bon :)
    sed -ne '/to=</,/>/ s/.*to=<\(.*\)>.*/\1/p' fichier

    pour en savoir plus sur sed:
    http://www.commentcamarche.net/faq/478-sed
    http://www.grymoire.com/Unix/Sed.html
    • [^] # Re: sed, grep, awk

      Posté par  . Évalué à 3.

      tiens, il reste un artefact de mes tests dans la ligne de grep, les '\(' et '\)' n'y servent à rien. La ligne suffisante est
      grep -o "to=<[^>]*>" fichier
      • [^] # Re: sed, grep, awk

        Posté par  . Évalué à 1.

        Mais c'est mortel l'option "-o" de grep (disponible dans le grep de FreeBSD). J'ai même pas pensé à cette commande.

        Eh bien merci !

Suivre le flux des commentaires

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