[Script Shell] Parser la liste des mails de la boîte r00t

Parser la liste des mails de la boîte r00t [Script Shell] - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 04-12-2005 à 17:10:59    

Bonjour,
 
Dans le cadre du développement d'un script perso, je souhaiterais parser la liste des mails de root (/var/mail/root).
 
Si je fais un

cat /var/mail/root


j'ai bien la liste des mails avec le contenu mais le format est un peu complexe à parser.
 
Si j'utilise la commande

mail


j'arrive à avoir une liste de mails qui devient plus facile à manipuler. Cependant, comme la commande attend un retour (exemple : taper q pour quitter), je n'arrive pas à récupérer cette liste.
 
Avant que je me lance dans une analyse un peu brute du /var/mail/root, je voulais savoir s'il existe un moyen simple de faire la liste des mails de root sous la forme :

[@ expéditeur] [sujet]


(un par ligne)
 
 
Merci pour vos infos


Message édité par ceyquem le 04-12-2005 à 19:57:05
Reply

Marsh Posté le 04-12-2005 à 17:10:59   

Reply

Marsh Posté le 04-12-2005 à 17:12:41    

regexp :)

Reply

Marsh Posté le 04-12-2005 à 17:13:44    

je connais le principe mais je maitrise pas trop, une autre idée ?? :D

Reply

Marsh Posté le 04-12-2005 à 19:04:43    

voilà où j'en suis dans mes tests :
 
Le fichier /var/mail/root que je veux mettre en forme :

root@triforce /etc/postfix #more /var/mail/root
From mon.email@free.fr  Sun Dec  4 17:05:27 2005
Return-Path: <mon.email@free.fr>
X-Original-To: root
Delivered-To: root@triforce.my.domain
Received: by triforce.my.domain (Postfix, from userid 0)
        id 70E5FC943F; Sun,  4 Dec 2005 17:05:27 +0100 (CET)
To: root@triforce.my.domain
Subject: http://www.clubic.com
Message-Id: <20051204160527.70E5FC943F@triforce.my.domain>
Date: Sun,  4 Dec 2005 17:05:27 +0100 (CET)
From: mon.email@free.fr (Charlie Root)
Status: O
 
 
From mon.email@free.fr  Sun Dec  4 17:18:26 2005
Return-Path: <mon.email@free.fr>
X-Original-To: root
Delivered-To: root@triforce.my.domain
Received: by triforce.my.domain (Postfix, from userid 0)
        id 18AF8C943F; Sun,  4 Dec 2005 17:18:26 +0100 (CET)
To: root@triforce.my.domain
Subject: http://www2.lefigaro.fr
Message-Id: <20051204161826.18AF8C943F@triforce.my.domain>
Date: Sun,  4 Dec 2005 17:18:26 +0100 (CET)
From: mon.email@free.fr (Charlie Root)
Status: O
Content-Length: 14
Lines: 1
 
texte inutile


 
après une première commande j'obtiens ça :
 

root@triforce /etc/postfix #cat /var/mail/root | grep -e "From:" -e "Subject:"
Subject: http://www.clubic.com
From: mon.email@free.fr (Charlie Root)
Subject: http://www2.lefigaro.fr
From: mon.email@free.fr (Charlie Root)
root@triforce /etc/postfix #


 
L'idée si vous ne l'avez pas devinée est d'obtenir un truc de ce genre :
 

http://www.clubic.com mon.email@free.fr
http://www2.lefigaro.fr mon.email@free.fr


 
Avez-vous une idée pour supprimer les retours à la ligne et le texte inutile qui peut se trouver entre ces entrées (sed ne convient pas pour cette opération car il travaille ligne par ligne :() ?
 
Merci :)


Message édité par ceyquem le 04-12-2005 à 19:05:52
Reply

Marsh Posté le 04-12-2005 à 19:26:02    

Quelque chose comme ça ?

sed -ne '/^Subject:/ {h};/^From:/ {H; g; s/Subject: \(.*\)\nFrom: \([^ ]*\) .*/\1 \2/p} /var/mail/root


 

Reply

Marsh Posté le 04-12-2005 à 19:40:04    

J'ai une drôle d'erreur :
 

root@triforce /etc/postfix #sed -ne '/^Subject:/ {h};/^From:/ {H; g; s/Subject: \(.*\)\nFrom: \([^
]*\) .*/\1 \2/p}' /var/mail/root
sed: 1: "/^Subject:/ {h};/^From: ...: extra characters at the end of h command


 
Est-ce du au fait que je suis sous OpenBSD ?

Reply

Marsh Posté le 04-12-2005 à 19:51:28    

sinon peux-tu m'expliquer rapidement le principe de cette commande ? j'ai un peu de mal à distinguer les différentes choses...
 
Merci en tout cas !

Reply

Marsh Posté le 04-12-2005 à 20:25:33    

ceyquem a écrit :

J'ai une drôle d'erreur :
 

root@triforce /etc/postfix #sed -ne '/^Subject:/ {h};/^From:/ {H; g; s/Subject: \(.*\)\nFrom: \([^
]*\) .*/\1 \2/p}' /var/mail/root
sed: 1: "/^Subject:/ {h};/^From: ...: extra characters at the end of h command


 
Est-ce du au fait que je suis sous OpenBSD ?


 
C'est en une seule ligne :D  
 
Ceci dit je ne sait pas si ça va marcher sur un sed non GNU.
 

ceyquem a écrit :

sinon peux-tu m'expliquer rapidement le principe de cette commande ? j'ai un peu de mal à distinguer les différentes choses...
 
Merci en tout cas !


 
L'option -n de sed sert à lui dire de rien afficher par défaut (c'est peut être spécifique à gnu sed d'ailleurs)
 

/^Subject:/ {   # Quand on rencontre une ligne qui commence par "Subject:"
h    # On la place dans le hold-buffer, en écrasant ce qu'il contenait auparavant
}
 
/^From:/ {  # Quand on rencontre une ligne qui commence par "From:"
H    # On rajoute un \n et la ligne courante à la suite du hold-buffer.  
g    # On met le hold buffer à la place du pattern buffer (le pattern buffer est ce sur quoi on travaille)
 
# La première fois qu'on arrive ici avec ton exemple, on a ça dans le pattern buffer :
# Subject: http://www.clubic.com\nFrom: mon.email@free.fr (Charlie Root)
 
s/Subject: \(.*\)\nFrom: \([^ ]*\) .*/\1 \2/p
 
# Le s sert à dire qu'on veut remplacer. ex : s/foo/bar/ remplace "foo" par "bar"
# le \1 est remplacé par ce qui est matché entre le premier couple de parenthèses
# le \2 est remplacé par ce qui est matché entre le deuxième couple de parenthèses
# le p sert à afficher, puisqu'on a demandé à sed de ne pas le faire par défaut avec le -n
}


 
Reste la regex :
 
Subject: \(.*\)\nFrom: \([^ ]*\) .*
 
. = n'importe quel caractère  
* = 0 fois ou plus
Les parenthèses servent simplement à nous permettre de réutiliser le résultat.
[^ ] = N'importe quel caractère sauf un espace (c'est pour ne pas avoir ce qui suit l'adresse mail dans le from). C'est le ^ qui permet de dire "sauf" quand il est placé au début d'un set de caractère. Par exemple :  
[abc] = Soit a, soit b, soit c.  
[abc^] = Soit a, soit b, soit c, soit ^
[^abc] = N'importe quel caractère sauf a, b et c.
 
Donc entre les premières parenthèses, on matche tout ce qu'il y a après le "Subject: " sur la ligne du sujet.
Entre les secondes parenthèses, on matche tout ce qu'il y a entre "From: " et le premier espace (non inclus).
 
 
 

Reply

Marsh Posté le 05-12-2005 à 08:10:24    

sed c'est vraiment un truc de sadiques^W^W d'hérétiques


---------------
uptime is for lousy system administrators what Viagra is for impotent people - mes unixeries - github me
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed