traitement d'un fichier de retour d'email d'erreur avec SED

traitement d'un fichier de retour d'email d'erreur avec SED - Codes et scripts - Linux et OS Alternatifs

Marsh Posté le 25-07-2007 à 10:25:42    

Bonjour,
je suis devant un petit soucis, en effet je me retrouve avec des fichier de retour d'email d'erreur assez important aprés un mailing sur nos client.
 
je souhaite faire un traitement autoomatique du fichier pour aporés faire un update des adresses en erreur dans ma base de données oracle.
 
 
1- j'ai donc un fichier de daprt classique d'email en reception Postfix.
2- je souhaite isoler les lignes Final-Recipient: et Diagnostic-code:+ la ligne suivante (souvent la fin du message)
 
 
j'ai donc ecrit un script sed:
 
/^Final-Recipient/ {
 p
}
/^Diagnostic/ {
  p
  n
  p
}
 
seulement voila, je ne sais pas comment enlever le retour chariot a la fin de ma première ligne Diagnostic-code: pour la concatener avec la suivante...
 
Pouvez-vous m'aider.
 
ps:- si vous avez des infos pour de la doc complete sed je suis preneur.
    - je suis DBA Oracle et je travaille sous Redhat LINUX ES
 
 
 

Reply

Marsh Posté le 25-07-2007 à 10:25:42   

Reply

Marsh Posté le 25-07-2007 à 10:49:25    

je n'arrive toujours pas a concatener la ligne commencant par diagno. et la suivante...
 
Voila mon script:
 
/^Final-Recipient/ {
 p #affichage
}
/^Diagnostic/ {
  h
  p
  #x
  #s/\n/ /g        #supr les retours ligne
  n  #ligne suivante dans pattern space
  H
  p
}
 
 
voila le resultat:
Final-Recipient: rfc822; sstahl@club-internet.fr
Diagnostic-Code: smtp; 552 La boite de votre correspondant
    sstahl@club-internet.fr est pleine, mailbox is temporarily over quota

Reply

Marsh Posté le 25-07-2007 à 11:29:26    

j'ai bien une idée avec ca :
-> Si une ligne commence par un signe égale (=), ajouter-là à la ligne précédente et remplacer le signe égale (=) par un espace  
sed -e :a -e '$!N;s/\n=/ /;ta' -e 'P;D'
 
comme ma ligne suivante commence toujours par 4 espace mais j'y arrive pas...

Reply

Marsh Posté le 25-07-2007 à 13:46:18    

Un peu de doc : http://www.grymoire.com/Unix/Sed.html


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 26-07-2007 à 09:00:33    

Merci.
 
au fait y a pas un endroit sur le forum ou l'on peut se presenter !
 

Reply

Marsh Posté le 26-07-2007 à 09:11:37    

mastoc34 a écrit :

Merci.
 
au fait y a pas un endroit sur le forum ou l'on peut se presenter !
 


 [:zytra]  
 
http://forum.hardware.fr/hfr/OSAlt [...] 4456_1.htm


---------------
TriScale innov
Reply

Marsh Posté le 26-07-2007 à 11:01:24    

personne a une solution pour concatener mes lignes...je seche :(
 
Final-Recipient: rfc822; sstahl@club-internet.fr  
Diagnostic-Code: smtp; 552 La boite de votre correspondant  
    sstahl@club-internet.fr est pleine, mailbox is temporarily over quota  
 
donnerais :
Final-Recipient: rfc822; sstahl@club-internet.fr  
Diagnostic-Code: smtp; 552 La boite de votre correspondant sstahl@club-internet.fr est pleine, mailbox is temporarily over quota  

Reply

Marsh Posté le 26-07-2007 à 11:20:34    

mastoc34 a écrit :

personne a une solution pour concatener mes lignes...je seche :(
 
Final-Recipient: rfc822; sstahl@club-internet.fr  
Diagnostic-Code: smtp; 552 La boite de votre correspondant  
    sstahl@club-internet.fr est pleine, mailbox is temporarily over quota  
 
donnerais :
Final-Recipient: rfc822; sstahl@club-internet.fr  
Diagnostic-Code: smtp; 552 La boite de votre correspondant sstahl@club-internet.fr est pleine, mailbox is temporarily over quota  


 
 
Solution avec "awk"  http://www.shellunix.com/awk.html  :)  

Code :
  1. awk '
  2. {
  3. if ($0 ~ /^Final-Recipient:/) {
  4.  print $0
  5. }
  6. if ($0 ~ /^Diagnostic-Code:/) {
  7.  printf("%s",$0)
  8.  getline
  9.  print $0
  10. }
  11. } ' Fichier_a_traiter.log


 

Reply

Marsh Posté le 26-07-2007 à 11:45:59    

ok je vais le tester mais j'aurai bien aimé comprendre comment faire avec sed..
 

Reply

Marsh Posté le 26-07-2007 à 17:41:22    

pour sed il faut regarder les caractères spéciaux afin de concaténer les chaines.
par exemple retour chariot c'est \n
si ca peut aider...

Reply

Marsh Posté le 26-07-2007 à 17:41:22   

Reply

Marsh Posté le 27-07-2007 à 10:49:33    

J'ai trouvé:
 
/^Final-Recipient/ {
 p #affichage
}
/^Diagnostic/ {
  N    #concat current line et next avec un /n
  s/   //g #effacement des 4 espace  
  s/\n//g  #effacement retour ligne entre current et next
  p  #affichage ligne en cours
}
 
 
Merci Xavier_OM c'est grace a ta doc.

Reply

Marsh Posté le 27-07-2007 à 10:57:59    

mastoc34 a écrit :

J'ai trouvé:
 
/^Final-Recipient/ {
 p #affichage
}
/^Diagnostic/ {
  N    #concat current line et next avec un /n
  s/   //g #effacement des 4 espace  
  s/\n//g  #effacement retour ligne entre current et next
  p  #affichage ligne en cours
}
 
 
Merci Xavier_OM c'est grace a ta doc.


 
de rien ;)


---------------
Il y a autant d'atomes d'oxygène dans une molécule d'eau que d'étoiles dans le système solaire.
Reply

Marsh Posté le 27-07-2007 à 11:02:20    

ouai en fait je concatenais bien ma current et la next mais la concaténation rajoutais un /n
 
c'etait sioux.

Reply

Sujets relatifs:

Leave a Replay

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