Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

Linux bash shell extraction de chaine

sbouli, le lundi 25 août 2008 à 13:11:32
Bonjour,

Je tente de developper un outil pour parser les logs postfix, je fais d'abord un

cat $D_LOGS/$v_fich | grep "status=bounced" > bounces.tmp


qui me permet de ne traiter que les bounces,

le but est d'écrire un fichier CSV à importer en bdd avec les champs :

nom_serveur, email, domaine, cause_bounce, date_badmail


un exemple de ligne du log est

Aug 20 08:57:00 serveurname postfix/smtp[1965]: 732DBD4C867: to=<toto.toto@wanadoo.fr>, relay=smtp.wanadoo.fr[193.252.22.78]:25, delay=0.1, delays=0.04/0/0.03/0.03, dsn=5.0.0, status=bounced (host smtp.wanadoo.fr[193.252.22.78] said: 550 <toto.toto@wanadoo.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command))




Mon premier jet étais avec la commande sed sous la forme :
sed '/@/!d;s/^\(.*\)'$(hostname)'.*<\(.*@\(.*\)\)>.*bounced\(.*\)$/'$(hostname)'|\2|\3|\4|\1/' bounces.tmp >>$(hostname).csv




cependant, impossible d'obtenir une date correcte car l'année ne figure pas dans les logs et le format est un peu arbitraire ... ne pouvant facilement bricoler la date, j'ai changé mon fusil d'épaule en utilisant :

while IFS=$' ' read mois jour heure serveur process id destinataire relay delay delays dsn status infos
	do
	echo -e "
		mois : $mois \n\
		jour : $jour \n\
		heure : $heure \n\
		serveur : $serveur \n\
		process : $process \n\
		id : $id \n\
		destinataire : $destinataire \n\
		relay : $relay \n\
		delay : $delay \n\
		delays : $delays \n\
		dsn : $dsn \n\
		status : $status \n\
		infos : $infos \n";
done < bounces.tmp





cependant, le champ destinataire est alors de la forme : to=<toto.toto@wanadoo.fr>, et pas seulement le mail ...

J'ai essayer de faire une fonction extract avec 3 paramètres, le premier la chaine, le second la chaine de debut (ici <) le troisième la chaine de fin (ici >) mais ça ne fonctionne pas ... :
extract()
{
	local str deb fin temp
	str="${1:-''}"
	deb="${2:-'<'}"
	fin="${3:-'>'}"
	$temp = echo ${str#*$deb}
	$temp2 = echo ${temp%*$fin}
	return $temp2
}






Merci de me venir en aide soit en améliorant le sed pour pouvoir ajouter l'année (soit en cours soit l'année de création du fichier de log), soit en réussissant la fonction de découpe de chaine avec délimiteurs ...

A moins que vous n'ayez d'autre idées ?????

En vous remerciant

Stéphane
Configuration: Windows XP
Internet Explorer 7.0
Répondre à sbouli  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le lundi 25 août 2008 à 14:32:19
Salut,

Une idée peut être...
$ cat fich
Aug 20 08:57:00 serveurname postfix/smtp[1965]: 732DBD4C867: to=<toto.toto@wanadoo.fr>, relay=smtp.wanadoo.fr[193.252.22.78]:25, delay=0.1, delays=0.04/0/0.03/0.03, dsn=5.0.0, status=bounced (host smtp.wanadoo.fr[193.252.22.78] said: 550 <toto.toto@wanadoo.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command))

$ awk '{ print $4","$7$12","$1,$2,$3 }' fich | sed 's/to=<//;s/>//'
serveurname,toto.toto@wanadoo.fr,status=bounced,Aug 20 08:57:00
:-))
$ man woman
Il n'y a pas de page de manuel pour woman.
Répondre à jipicy

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sbouli, le lundi 25 août 2008 à 15:23:05
Hello,

Incroyable, quand je pense que je rame depuis perpette la dessus ...

Si je pouvais abuser ... comment avoir plutot :

serveur_name,email,domaine,cause,date_heure

serveur_name = ça c'est déjà ok
email = ça c'est déjà ok
domaine = extraction du domaine du mail ... (à partir de @)
cause = tout ce qui suit status=bounced
date_heure = au format DD/MM/YYYY HH:MM:SS ou YYYYMMDD HHMMSS

Moi je sature sur toutes ces commandes à 8000 attributs et autre expression régulières qui se chevauchent ....

Au secours ....

Stéphane
Répondre à sbouli

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
sbouli, le lundi 25 août 2008 à 17:54:25
Euuu encore moi, suis toujours dessus ...

J'essais de mettre en place un tableau associatif pour changer le mois par son numéro exemple Aug devient 08

J'ai trouvé cette doc (ici : http://www.c-sait.net/cours/bash.php )




Pour créer un tableau en n'utilisant pas les indices par défaut, on utilisera la syntaxe suivante : 

> tableau2=([clé0]=valeur0 [clé1]=valeur1 [clé2]=valeur2)
 
Où les clés peuvent être n'importe quelles chaînes de caractères. A un tableau créé avec les index numériques par défaut, on peut très bien ajouter un élément dont la clé est une chaîne de caractères. 





Donc je fais :




Mois=(["Jan"]="01" ["Fev"]="02" ["Aug"]="08" ["Sep"]="09" ["Oct"]="10");

ou 

Mois=([Jan]="01" [Fev]="02" [Aug]="08" [Sep]="09" [Oct]="10");



et j'obtiens TOUJOURS :

echo "numéro du mois ${Mois[Aug]}"
>numéro de mois 10

echo "numéro du mois ${Mois['Aug']}"
>numéro de mois 10


...GRRR....
Répondre à sbouli

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
jipicy, le lundi 25 août 2008 à 18:29:04
Tiens essayes ça :
[tmpfs]$ cat fich
Aug 20 08:57:00 serveurname postfix/smtp[1965]: 732DBD4C867: to=<toto.toto@wanadoo.fr>, relay=smtp.wanadoo.fr[193.252.22.78]:25, delay=0.1, delays=0.04/0/0.03/0.03, dsn=5.0.0, status=bounced (host smtp.wanadoo.fr[193.252.22.78] said: 550 <toto.toto@wanadoo.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command))
Aug 22 09:57:00 monserveur postfix/smtp[1965]: 732DBD4C867: to=<titi.titi@free.fr>, relay=smtp.free.fr[193.252.22.78]:25, delay=0.1, delays=0.04/0/0.03/0.03, dsn=5.0.0, status=bounced (host smtp.free.fr[193.252.22.78] said: 550 <titi.titi@free.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command))

[tmpfs]$ cat foo.sh
#! /bin/bash

while read line
do
cause=$(awk -F"(" '{ print "("$2"("$3 }' <<<$line)
DATE=$(awk '{ print $1,$2,$3 }' <<<$line)
NEW_DATE=$(date --date="${DATE}" '+%d/%m/%Y %H:%M:%S')
NEW_line=$(awk '{ print $4","$7$12"," }' <<<$line | sed 's/to=<//;s/>//')
sed "s|\(.*@\)\([^,]*\)\(.*\)|\1\2,\2,${cause},${NEW_DATE}|" <<<$NEW_line
done < fich

[tmpfs]$ ./foo.sh
serveurname,toto.toto@wanadoo.fr,wanadoo.fr,(host smtp.wanadoo.fr[193.252.22.78] said: 550 <toto.toto@wanadoo.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command)),20/08/2008 08:57:00
monserveur,titi.titi@free.fr,free.fr,(host smtp.free.fr[193.252.22.78] said: 550 <titi.titi@free.fr>: Recipient address rejected: User unknown (in reply to RCPT TO command)),22/08/2008 09:57:00

[tmpfs]$ 
;-))
$ man woman
Il n'y a pas de page de manuel pour woman.
Répondre à jipicy

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 sbouli, le lundi 25 août 2008 à 18:54:44
tu es incroyable ... je bataille depuis des jours ....

MERCI !!

Stéphane
Répondre à sbouli

Résultats pour linux bash shell extraction de chaine

Code source Linux (Résolu) Bonjour, Je dois coder un jeu sous linux en shell BASH, donc ne sachant pas comment commencer j'ai pensé à m'apuyer sur un jeu déjà fait sous linux pour démarer. Donc j'aimerais avoir par exemple le code source d'un jeu très... www.commentcamarche.net/forum/affich-6748759-code-source-linux
[linux - bash] explosion chaine de caracteres (Résolu) Bonjour tout le monde. Je voudrais savoir s'il existe sous Linux une commande pour exploser une chaine de caractere à partir d'un sépérateur donné et récupérer un élément de cette chaine. Exemple : save_2005_03_31 donne une fois explosé... www.commentcamarche.net/forum/affich-1407730-linux-bash-explosion-chaine-de-caracteres
[SHELL] Extraction et remplacement chaine (Résolu) Bonjour à tous, J'ai un soucis de programmation Shell (csh). Voilà : J'ai 2 fichiers : un fichier fichier.txt et un fichier fichier_old.txt. Les 2 fichiers contiennent chacun une ligne "variable = qqchose", et qqchose = 0 dans fichier.txt.... www.commentcamarche.net/forum/affich-2903000-shell-extraction-et-remplacement-chaine

Résultats pour linux bash shell extraction de chaine

[Shell] Transferer des fichiers via sshSSH - Secure SHell Utilisation Informations complémentaires LOGICIELS Sous Linux/Unix Sous Windows Avertissement Utilisation SSH permet d'utiliser des pipelines de commandes, et d'utiliser des tubes d'entrées/sorties comme toute autre... www.commentcamarche.net/faq/sujet-904-shell-transferer-des-fichiers-via-ssh
Comment lire un fichier ligne par ligneComment lire un fichier ligne par ligne Préambule Boucle while Syntaxe Exemple Astuces Bonus Boucle for Syntaxe Préambule Une des erreurs les plus communes dans l'apprentissage des scripts "bash" sous GNU/LInux pour lire un fichier... www.commentcamarche.net/faq/sujet-5027-comment-lire-un-fichier-ligne-par-ligne
[Linux] Vérifier la réussite de la gravure d'un cdVérifier la réussite de la gravure d'un cd Rappel Principe Fonctionnement Rappel Sous Linux il existe un logiciel vous permettant directement de vérifier l'intégrité d'un fichier par comparaison. C'est md5sum qui permet de calculer la... www.commentcamarche.net/faq/sujet-1923-linux-verifier-la-reussite-de-la-gravure-d-un-cd

Résultats pour linux bash shell extraction de chaine

[Batch] Extraction chaîne de caractères (Résolu)Salut, j'ai un problème avec la manipulation d'une chaîne de caractères. J'ai un fichier (temp2.txt) qui contient une chaîne de caractètes comme tel : 1:4162 La chose que je veux faire c'est d'extraire le chiffre "4162" afin... www.commentcamarche.net/forum/affich-2256829-batch-extraction-chaine-de-caracteres
Script shell extraction de texte precis (Résolu)Bonjour, Je souhaite, a l'aide d'un script shell, extraire une partie d'un fichier txt. Cette partie est comprise entre deux motifs identiques et doit contenir une variable précise. exemple fichier d'entrée: motif motif motif motif... www.commentcamarche.net/forum/affich-6873245-script-shell-extraction-de-texte-precis
[C] Extract chaîne de caract et Compte (Résolu)Bonjour, Je souhaite créer des Pareto (histogrammes) de nombre produits testés par mode de test. Pour cela j'extrais les infos des fichiers texte srtis des testeurs. J'ai commencé à faire ça, mais j'ai un souci avec le "case" : /*On... www.commentcamarche.net/forum/affich-1636989-c-extract-chaine-de-caract-et-compte

Résultats pour linux bash shell extraction de chaine

Linux - Le shellIntroduction au shell L'interpréteur de commandes est l'interface entre l'utilisateur et le système d'exploitation, d'où son nom anglais «shell», qui signifie «coquille». Le shell est ainsi chargé de faire l'intermédiaire le système... www.commentcamarche.net/contents/linux/linshell.php3
Linux - Gestion des utilisateursPremier pas de l'administrateur Lorsque diverses personnes ont accès à un système, il est nécessaire que l'administrateur système gère les utilisateurs. Pour ceci, les commandes usuelles et les fichiers à configurer doivent être connus. Les... www.commentcamarche.net/contents/linux/linusr.php3
ASP - L'objet ResponsePrésentation de l'objet Response Le rôle de l'objet Response est de permettre de créer la réponse HTTP qui va être envoyée au navigateur, c'est-à-dire la page Web demandée par le client. L'objet Response permet ainsi de manipuler l'ensemble des... www.commentcamarche.net/contents/asp/asp-response.php3