Forum Programmation.shell Afficher deux champs depuis un log

Posté par  .
Étiquettes : aucune
0
9
sept.
2009
Bonjour.

Je dois parser mon log de Postfix et sortir les mails bouncés. Il faut que je sorte le mail et la raison.

Voici à quoi ressemble une ligne :

Sep 9 09:27:14 fidji postfix/smtp[13495]: 8B9558825: to=, relay=mail.domain.fr[195.68.104.189], delay=4, status=bounced (host mail.domain.fr[195.68.999.999] said: 554 5.7.1 : Recipient address rejected: Access denied (in reply to RCPT TO command))

Je dois avec un script, sortir :

"xxxxxxx@domain.fr Recipient address rejected: Access denied (in reply to RCPT TO command)"

Donc, afficher ces deux champs, mais qui sont séparés dans le log, et exclure le reste.

Je sais afficher un champ précis, mais pas les deux en même temps.

Pour l'instant, j'utilise :

cat /var/log/mail.log | grep "status=bounced"|grep -o "to=<[^>]*>"| sed -e 's/to=<\(.*\)>/\1/'

Mais comment ajouter la dernière ligne à cette commande ? (dernière ligne qui est après le "said:")

Merci !
  • # awk ?

    Posté par  . Évalué à 2.

    Sep 9 09:27:14 fidji postfix/smtp[13495]: 8B9558825: to=, relay=mail.domain.fr[195.68.104.189], delay=4, status=bounced (host mail.domain.fr[195.68.999.999] said: 554 5.7.1 : Recipient address rejected: Access denied (in reply to RCPT TO command))

    awk -F: '{print $5 $6 $7}' fichier.log

    ne te renvoie deja plus que
    to=, relay=mail.domain.fr[195.68.104.189], delay=4, status=bounced (host mail.domain.fr[195.68.999.999] said 554 5.7.1 Recipient address rejected
    • [^] # Re: awk ?

      Posté par  . Évalué à 1.

      Oui j'avais essayé avec un awk, mais seulement l'ordre des champs varie des fois, suivant certains critères (pas le même nombre de mots). C'est pour ça, me baser sur le mot précis que je cherche, fonctionne mieux que me baser sur le numéro du champ (qui varie).
      • [^] # Re: awk ?

        Posté par  . Évalué à 2.

        il suffit de changer le separateur
        dans mon cas -F: pour utiliser : comme separateur plutot que l'espace
  • # sed, c'est dien

    Posté par  . Évalué à 3.

    cat + 2 grep et un sed, ça fait beaucoup pour un truc qui peur se faire avec un seul sed :)

    Un de tes problèmes ici est que ton grep -o restreint ta ligne à ce qui correspond à ton motif, et ton motif actuel exclut ce qui se trouve après > (donc ce qu'il y a après le said)


    sed -ne 's/.*to=<\([^>]*\)>.*status=bounced.*said:[^:]*:/\1/p' /var/log/mail.log


    concernant le motif commençant à "said", je m'appuie sur ton exemple car je ne connais pas le format général d'une ligne de bounced. Il faut potentiellement généraliser pour traiter les lignes qui ne serait pas du genre "said: du blablabla : le texte que tu veux"
    • [^] # Re: sed, c'est dien

      Posté par  . Évalué à 2.

      Merci !

      Mais, bizarrement, quand je lance cette commande, ça me sort beaucoup moins d'enregistrement que ce qu'il y a en vrai.

      cat /var/log/mail.log | grep "status=bounced" me sort 31 lignes actuellement, alors que
      sed -ne 's/.*to=<\([^>]*\)>.*status=bounced.*said:[^:]*:/\1/p' /var/log/mail.log ne va m'en sortir que 10. Sacrée différence ! :-)

      J'ai pourtant bien un 'status=bounced' et un 'said' dans chacune de mes lignes..
    • [^] # Re: sed, c'est dien

      Posté par  . Évalué à 2.

      Voilà, ça ne gère pas ces lignes là :

      Sep 9 11:52:06 fidji postfix/smtp[26818]: 698448125: to=<xxxxxxxxxxx@laposte.net>, relay=smtp4.laposte.net[193.251.214.xxx, delay=1, status=bounced (host smtp4.laposte.net[193.251.214.xxx] said: 550 <xxxxxxxx@laposte.net>: Recipient address rejected: User unknown (in reply to RCPT TO command))

      Mais ça va bien me sortir ces lignes là :
      Sep 9 09:27:13 fidji postfix/smtp[29268]: D6E4C8836: to=<xxxxxxxxx@xxxxxx.fr>, relay=mail.xxxxx.fr[80.13.123.xxxx], delay=8, status=bounced (host mail.xxxxx.fr[80.13.123.xxx] said: 550 5.1.1 User unknown (in reply to RCPT TO command))

      Comme si les <> présents dans la ligne après "said" posaient problème


      (pfiou c'est chaud sed, j'suis en train de lire, quand je vois tes lignes, je pleure)
      • [^] # Re: sed, c'est dien

        Posté par  . Évalué à 3.

        heu, c'est pas le contraire ?
        de ce que je vois dans tes deux lignes, la première correspond le motif "said: blabla : d'autres trucs" tandis que la seconde est "said: blabla". Or la regex de mon commentaire s'appuyait sur la présence d'une seconde occurence du caractère ":".

        C'est ce que je signalais dans mon commentaire précédent, il faut regarder tous les formats possibles après le said pour établir une regex qui matchera à tous les coups.

        Fais un:
        grep "status=bounced" /var/log/mail.log |grep -o "said.*"


        En partant des résultats de ce grep, tu pourras essayer d'établir une regex qui découpe ce motif à ta convenance, et la ré injecter dans le sed initial.
        • [^] # Re: sed, c'est dien

          Posté par  . Évalué à 1.

          J'ai bien fouillé dans le log, et voici les deux lignes que je dois matcher :

          Sep 9 11:52:06 server postfix/smtp[26818]: 698448125: to=<xxxxxxxxxxx@laposte.net>, relay=smtp4.laposte.net[193.251.214.xxx, delay=1, status=bounced (host smtp4.laposte.net[193.251.214.xxx] said: 550 <xxxxxxxx@laposte.net>: Recipient address rejected: User unknown (in reply to RCPT TO command))

          Sep 9 09:27:13 server postfix/smtp[29268]: D6E4C8836: to=<xxxxxxxxx@xxxxxx.fr>, relay=mail.xxxxx.fr[80.13.123.xxxx], delay=8, status=bounced (host mail.xxxxx.fr[80.13.123.xxx] said: 550 5.1.1 User unknown (in reply to RCPT TO command))


          Et j'arrive vraiment pas à modifier cette regex avec sed pour qu'elle match les deux :-(
  • # création facile de regex

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

    avec txt2regex

    http://txt2regex.sourceforge.net/

    ウィズコロナ

  • # pflogsumm ?

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

    pflogsumm ça ne te plait pas (à mettre dans un cron) ?

    Grand Totals
    ------------
    messages

    470 received
    483 delivered
    0 forwarded
    0 deferred
    1 bounced
    554 rejected (53%)
    14 reject warnings
    0 held
    0 discarded (0%)

    [...]
    message deferral detail: none

    message bounce detail (by relay)
    --------------------------------
    mail2.akka.fr[195.167.225.220]:25 (total: 1)
    1 <> sender cannot be empty (in reply to MAIL FROM command)

    les pixels au peuple !

Suivre le flux des commentaires

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