IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

Récupération de données de mails et mise en forme des données récupérées


Sujet :

Shell et commandes POSIX

  1. #1
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut Récupération de données de mails et mise en forme des données récupérées
    Bonjour à tous,

    Voici mon problème :

    Des mails sont envoyés à une adresse qui les convertit en fichiers .txt
    Sur ces fichiers .txt, je dois récupérer l'expéditeur du mail (le From), le destinataire (le To) et la date d'envoi.
    La conversion des mails en fichiers .txt donne cela :

    From: "DUPONT Pierre [CERA]" <dupont.pierre@gmail.fr>
    To: =?iso-8859-1?Q?MARTIN_Julien_=5BCERA=5D?=
    <julien.martin@gmail.fr>
    Subject: SAV AGENCE
    Thread-Topic: SAV AGENCE
    Thread-Index: Ac+JYBcZ/f1fG23NS82TEygEo3u5mw==
    Date: Mon, 16 Jun 2014 14:45:08 +0200
    Pour l'instant mon code est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    #echo "Recuperation de l'expediteur"
    #EXPEDITEUR=$(awk 'BEGIN {FS = ":";} $1 == "From" {print $0;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    #
    #echo "Recuperation de la date"
    #DATE_ENVOI=$(awk 'BEGIN {FS = ":";} $1 == "Date" {print $0;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    RES=$(awk 'BEGIN {FS = ":"; varFrom = ""; varTo = ""; varDate = ""; flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {varTo = varTo $0;}
    $1 == "From" {varFrom = $0;}
    $1 == "To" {varTo = $0; flag=1;}
    $1 == "Date" {varDate = $0;}
    END {print varFrom "µ"; print varTo "µ"; print varDate;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    echo ${RES} | IFS="µ" read EXPEDITEUR DESTINATAIRE DATE_ENVOI
     
    $EXPEDITEUR = 
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"

    Et me permet de récupérer les données sous cette forme :

    EXPEDITEUR=From: "DUPONT Pierre" <pierre.dupont@gmail.fr>
    DESTINATAIRE= To: =?iso-8859-1?Q?MARTIN_Julien_=5BCERA=5D?=
    <julien.martin@gmail.fr>
    DATE_ENVOI= Date: Mon, 16 Jun 2014 14:45:08 +0200

    Mon problème concerne en fait la mise en forme de ces données récupérées :
    - J'aimerais récupérer seulement l'adresse mail qui est entre <> pour l'expéditeur
    - Idem pour le destinataire (à noter que pour l'instant je récupère le destinataire sur deux lignes et c'est seulement la 2ème qui m'intéresse)
    - Pour la date, j'aimerai la convertir en JJ/MM/AAAA


    Merci d'avance pour votre aide !

  2. #2
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Voici une piste à explorer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    $ cat test.txt 
    From: "DUPONT Pierre [CERA]" <dupont.pierre@gmail.fr>
    To: =?iso-8859-1?Q?MARTIN_Julien_=5BCERA=5D?=
    <julien.martin@gmail.fr>
    Subject: SAV AGENCE 
    Thread-Topic: SAV AGENCE 
    Thread-Index: Ac+JYBcZ/f1fG23NS82TEygEo3u5mw==
    Date: Mon, 16 Jun 2014 14:45:08 +0200
    $ grep "^From" test.txt|egrep -o "[A-Za-z0-9\._]+@[A-Za-z0-9\._]+"
    dupont.pierre@gmail.fr
    $ grep "^<" test.txt|egrep -o "[A-Za-z0-9\._]+@[A-Za-z0-9\._]+"
    julien.martin@gmail.fr
    $ date +"%d/%m/%Y" -d "$(grep "^Date:" test.txt|cut -d " " -f2-)"
    16/06/2014
    Cordialement,
    Idriss

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 279
    Points : 12 727
    Points
    12 727
    Par défaut
    Bonjour,

    Voici sinon, un réarrangement de ton script awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    $ cat file_mail.txt 
    From: "DUPONT Pierre [CERA]" <dupont.pierre@gmail.fr>
    To: =?iso-8859-1?Q?MARTIN_Julien_=5BCERA=5D?=
    <julien.martin@gmail.fr>
    Subject: SAV AGENCE 
    Thread-Topic: SAV AGENCE 
    Thread-Index: Ac+JYBcZ/f1fG23NS82TEygEo3u5mw==
    Date: Mon, 16 Jun 2014 14:45:08 +0200
    $ RES=$(awk 'BEGIN {FS = "[<>]"; varFrom = ""; varTo = ""; varDate = ""; flag = 0;}
    /^Subject:/ {flag=0;}
    flag == 1 {varTo = varTo $2;}
    /^From:/ {varFrom = $2;}
    /^To:/ {varTo = $2; flag=1;}
    /^Date:/ {sub(/^Date: */,"");varDate=$0}
    END {print "EXPEDITEUR="varFrom ; print "DESTINATAIRE="varTo ; system("date +\"DATE=%d/%m/%Y\" -d \""varDate"\"");}' file_mail.txt)
    $ echo "$RES"
    EXPEDITEUR=dupont.pierre@gmail.fr
    DESTINATAIRE=julien.martin@gmail.fr
    DATE=16/06/2014
    Ici, je ne crée pas les variables EXPEDITEUR,DESTINATAIRE et DATE et il faudra certainement l'amélioré si tu a plusieurs destinataires sur la même ligne...
    Cordialement.

  4. #4
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Merci pour vos réponses. J'ai réussi à avancer concernant ma récupération de données :

    Voici le code que j'ai mis en place :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    RES=$(awk 'BEGIN {FS = ":"; varFrom = ""; varTo = ""; varDate = ""; flag = 0; vPdeb=0; vPfin=0;} 
     
    $1 == "Subject" {flag=0;} 
     
    flag == 1 {varTo = varTo $0; vPdeb=index(varTo,"<");vPfin=index(varTo,">"); varTo = substr(varTo,vPdeb+1,vPfin-vPdeb-1); } 
     
    $1 == "From" {vPdeb=index($0,"<");vPfin=index($0,">");varFrom = substr($0,vPdeb+1,vPfin-vPdeb-1);} 
     
    $1 == "To" {varTo = $0; flag=1;} 
     
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);} 
     
    END {print sprintf("export EXPEDITEUR=%s;export DESTINATAIRE=%s;export DATE_ENVOI=\"%s\"",varFrom,varTo,varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt) 
     
    echo "$RES"

    Et voici ce que je récupère :


    export EXPEDITEUR=pierre.dupont@gmail.fr;export DESTINATAIRE=julien.martin@gmail.fr;export DATE_ENVOI="16 Jun 2014 14:45:08"

    Mon problème est désormais de pouvoir récupérer ces données sous cette forme :

    EXPEDITEUR=pierre.dupont@gmail.fr;
    DESTINATAIRE=julien.martin@gmail.fr;
    DATE_ENVOI="16 Jun 2014 14:45:08"

    Je ne vois pas trop comment faire cela. Donc si vous avez une idée ?

    Merci d'avance

  5. #5
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    print sprintf("export EXPEDITEUR=%s;export DESTINATAIRE=%s;export DATE_ENVOI=\"%s\"",varFrom,varTo,varDate);
    Pourquoi faire printf de sprintf ?
    Pourquoi écrire "export" ici sachant que ça ne sera pas exécuté par bash et que visiblement ça ne correspond pas à la sortie attendue ?
    Pourquoi mettre des ";" si tu veux des retours à la ligne ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("EXPEDITEUR=%s\nDESTINATAIRE=%s\nDATE_ENVOI=\"%s\"", varFrom, varTo, varDate);
    Cordialement,
    Idriss

  6. #6
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    J'ai réussi à récupérer ce que je souhaitais, voilà mon code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    read EXPEDITEUR <<<$(awk -F "[<> ]" '/^From:/ {print $(NF-1)} ' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DESTINATAIRE=$(awk 'BEGIN {FS = ":";  varTo = "";  flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = varTo ";" substr($0,vPdeb+1,vPfin-vPdeb-1) ";";}
    $1 == "To" {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = substr($0,vPdeb+1,vPfin-vPdeb-1); flag=1;}
    END {print varTo;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    eval "$DATE_ENVOI"
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"

    et voici ce que je récupère :

    EXPEDITEUR=pierre.dupont@gmail.fr
    DESTINATAIRE=julien.martin@gmail.fr
    DATE_ENVOI=16 Jun 2014 14:45:08
    Le problème que je rencontre désormais est que j'aimerai intégrer ces résultats dans 3 variables VarFrom, VarTo, et VarDate.

    J'ai essayé avec ce code mais ça ne fonctionne pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    varFrom=$(EXPEDITEUR)
    varTo=$(DESTINATAIRE)
    varDate=$(DATE_ENVOI)
    Merci d'avance pour votre aide

  7. #7
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Bonjour.

    EXPEDITEUR, DESTINATAIRE et DATE_ENVOI sont des variables pas des commandes. Il va falloir lire un cours sur la sous-exécution des commandes Shell
    => http://frederic-lang.developpez.com/...l/?page=page_5

    Ceci devrait t'aider également si tu souhaite récupérer dans tes variables la partie gauche du "=" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    IFS="=" read -ra varFrom <<< "$EXPEDITEUR"
    IFS="=" read -ra varTo <<< "$DESTINATAIRE"
    IFS="=" read -ra varDate <<< "$DATE_ENVOI"
    Après pour accéder aux valeurs après le "=" :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo "${varFrom[1]}"
    echo "${varTo[1]}"
    echo "${varDate[1]}"
    Cordialement,
    Idriss

  8. #8
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ElPibeOro Voir le message
    et voici ce que je récupère :
    Pour les résultats, merci d'utiliser la balise CODE et non la balise QUOTE!

    Le problème que je rencontre désormais est que j'aimerai intégrer ces résultats dans 3 variables VarFrom, VarTo, et VarDate.

    J'ai essayé avec ce code mais ça ne fonctionne pas...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    varFrom=$(EXPEDITEUR)
    varTo=$(DESTINATAIRE)
    varDate=$(DATE_ENVOI)
    Peur-être quelque chose comme ceci (avec des accolades à la place des parenthèses):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    varFrom=${EXPEDITEUR}
    varTo=${DESTINATAIRE}
    varDate=${DATE_ENVOI}
    ou alors, veux-tu dire que tu as un script qui produit les lignes indiquées et que tu voudrais récupérer ces valeurs à l'extérieur de ce script (c'est-à-dire dans le script appelant)?

    Comme ma boule de cristal est chez le réparateur, j'ai un peu de mal à deviner...

  9. #9
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Idriss merci pour ta réponse ! Je vais lire le document que tu m'as envoyé.

    Jack merci également, mais comme je l'avais souligné au début, je suis DEBUTANT avec ce langage de programmation, donc désolé si je m'exprime mal sur certains points.
    Ta solution des accolades ne fonctionne pas mieux. Par contre ta boule de cristal fonctionne trés bien ! J'ai en effet un script qui permet de produire les lignes indiquées et je voudrais les récupérées dans 3 variables pour les exporter dans des tables Oracle.

    Merci encore pour votre aide

  10. #10
    Rédacteur

    Avatar de ok.Idriss
    Homme Profil pro
    IS Consultant
    Inscrit en
    Février 2009
    Messages
    5 220
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : IS Consultant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2009
    Messages : 5 220
    Points : 19 452
    Points
    19 452
    Par défaut
    Citation Envoyé par ElPibeOro Voir le message
    Ta solution des accolades ne fonctionne pas mieux.
    C'est à dire ? Tu retrouve exactement les valeurs ci-dessous :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    EXPEDITEUR=pierre.dupont@gmail.fr
    DESTINATAIRE=julien.martin@gmail.fr
    DATE_ENVOI=16 Jun 2014 14:45:08
    ? Si c'est pas ça, tu obtiens un message d'erreur ? Rien du tout ? Il faut être plus précis

    Si tu obtiens les mêmes valeurs (ce que je soupçonne) c'est normal, parce que la tu te contente d'affecter une valeur de variable à une autre variable, ça ne va pas la transformer par magie. En revanche, si comme je le soupçonne tu veux récupérer :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    pierre.dupont@gmail.fr
    julien.martin@gmail.fr
    16 Jun 2014 14:45:08
    dans trois variables distinctes, je t'ai déjà indiqué comment faire dans mon précédent message .

    Cordialement,
    Idriss

  11. #11
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Merci encore pour ton aide Idriss.
    En fait lorque j'éxécute mon code, ça me renvoit ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    EXPEDITEUR=pierre.dupont@gmail.fr
    DESTINATAIRE=julien.martin@gmail.fr
    DATE_ENVOI=16 Jun 2014 14:45:08
    Et je voudrais mettre ces lignes de commande dans 3 variables pour pouvoir les exporter dans des tables Oracle :
    VarFrom = pierre.dupont@gmail.fr
    VarTo = julien.martin@gmail.fr
    VarDate = 16 Jun 2014 14:45:08


    Si je rajoute ça dans mon code (testé avec des accolades et des parenthèses) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    varFrom=$(EXPEDITEUR)
    varTo=$(DESTINATAIRE)
    varDate=$(DATE_ENVOI)
    Et qu'ensuite je fais un :
    ou un :
    ça ne me renvoi rien du tout.

    Ma besoin correspond donc bien à la manipulation que tu m'as indiqué dans ton message précédent. Je vais essayer...

  12. #12
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ok.Idriss Voir le message
    C'est à dire ? Tu retrouve exactement les valeurs ci-dessous :
    @ok.Idriss: Non, non! D'après sa réponse à ma question, il a un script qui AFFICHE sur la stdout les valeurs des variables et il voudrait les récupérer dans l'appelant.

    @ElPibeOro: Si tu veux plus de détail, il faudrait que tu nous expliques un peu plus le contexte, c'est-à-dire ce que tu veux faire avec les données récupérées. Je n'ai pas bcp de temps pour élaborer. Mais, en gros, 2 possibilités:

    Solution 1:
    Tu fais tout le traitement dans un seul script!

    Dans ton script, tu vas à la pêche aux infos (comme tu as fait (mais en simplifiant les print + sprintf)) puis tu utilises le résultat (à l'intérieur du script) pour en faire ce que tu veux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    read EXPEDITEUR <<<$(awk -F "[<> ]" '/^From:/ {print $(NF-1)} ' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DESTINATAIRE=$(awk 'BEGIN {FS = ":";  varTo = "";  flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = varTo ";" substr($0,vPdeb+1,vPfin-vPdeb-1) ";";}
    $1 == "To" {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = substr($0,vPdeb+1,vPfin-vPdeb-1); flag=1;}
    END {print varTo;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    eval "$DATE_ENVOI"
     
    # Ici, j'utilise comme je veux les infos
     
    # Par exemple, je les affiche sur la stdout:
     
    echo "EXPEDITEUR=='${EXPEDITEUR}' - DESTINATAIRE="'${DESTINATAIRE}' - DATE_ENVOI='${DATE_ENVOI}'"
    Solution 2:
    Tu passes les infos récupérées en paramètre à un autre script (ou à un programme extérieur ou à une fonction du même script)

    Programme "principal":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    read EXPEDITEUR <<<$(awk -F "[<> ]" '/^From:/ {print $(NF-1)} ' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DESTINATAIRE=$(awk 'BEGIN {FS = ":";  varTo = "";  flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = varTo ";" substr($0,vPdeb+1,vPfin-vPdeb-1) ";";}
    $1 == "To" {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = substr($0,vPdeb+1,vPfin-vPdeb-1); flag=1;}
    END {print varTo;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    eval "$DATE_ENVOI"
     
    # J'appelle le "sous-programme" auquel je passe les données récupérées:
    ./autre_script.sh "${EXPEDITEUR}" "${DESTINATAIRE}" "${DATE_ENVOI}"
    et dans le fichier "./autre_script.sh" ("sous-programme"), tu reçois et exploite les données reçues:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    #!/bin/ksh
     
    # ici, je récupère et exploite les données reçues du programme principal:
     
    EXPEDITEUR=$1
    DESTINATAIRE=$2
    DATE_ENVOI=$3
     
    echo "EXPEDITEUR=='${EXPEDITEUR}' - DESTINATAIRE="'${DESTINATAIRE}' - DATE_ENVOI='${DATE_ENVOI}'"

  13. #13
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Bon, j'ai pu avancer avec ta solution Idriss. En fait mon problème n'était pas trés compliqué, je pense que je me suis mal exprimé sur mon besoin.
    Je vais essayer d'être plus précis sur ce que je dois faire maintenant.

    Voici mon code dans l'état actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
     
    #!/bin/ksh
    #*********************************************************************
    # Description  : Script tournant tous les jours, envoyant à IRF les notes à publier - à modifier
    # Parametre    : Aucun
    # Periodicite    : quotidienne
    #*********************************************************************
    #===============================================================================
    # == Declaration des variables d'environnement
    . /appli/irfv2/irfv2.env
    . ${SAVAGE_HOME}/savage.env
     
    # == Initialisation du Suivi
    ID_TRT="$(basename $0 .l)";
    PATH_TRA=${SAVAGE_HOME}/result/tra${ID_TRT}.$(date '+%y%m%d').res;
    [ -f ${PATH_TRA}.Z ] && uncompress ${PATH_TRA};
    (
    echo "==========================================================";
    date
    echo "$0 $*";
    echo "trt.l/ trt";
    echo "==========================================================";
     
    # == Suivi - Debut des traitements
    ${SUIVI_DEBUT} ${ID_TRT} SHELL $0
     
    read EXPEDITEUR <<<$(awk -F "[<> ]" '/^From:/ {print $(NF-1)} ' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DESTINATAIRE=$(awk 'BEGIN {FS = ":";  varTo = "";  flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = varTo ";" substr($0,vPdeb+1,vPfin-vPdeb-1) ";";}
    $1 == "To" {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = substr($0,vPdeb+1,vPfin-vPdeb-1); flag=1;}
    END {print varTo;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    eval "$DATE_ENVOI"
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"
     
    varFrom=$(echo $EXPEDITEUR) # Ce qu'affiche la commande "echo" ira dans "varFrom" 
    varTo=$(echo $DESTINATAIRE)
    varDate=$(echo $DATE_ENVOI)
     
    echo $varFrom
    echo $varTo
    echo $varDate
     
    # ----------------------------------
     
    # == Epuration fichiers trace : suppression des traces de plus d'un an
    find ${SAVAGE_HOME}/result -type f -name "*.*" -mtime +360 -exec rm -f {} \;
    date;
    ) >> ${PATH_TRA} 2>&1;
     
    # == Suivi - Fin des traitements
    ${SUIVI_FIN} ${ID_TRT} >/dev/null 2>&1
    compress ${PATH_TRA};
    exit;

    Ce code me permet de récupérer 3 variables :
    -varFrom : pierre.dupont@gmail.fr
    -varTo : julien.martin@gmail.fr
    -varDate : 16 Jun 2014 14:45:08


    Désormais je rencontre deux problèmes :
    1) Comment reformater la date pour l'avoir au format JJ/MM/AAAA HH/MM/SS ??
    Je souaite faire cette transformation avec Shell( et pas sous Oracle)
    J'ai essayé ça mais ça ne fonctionne pas :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    # == Reformatage de la date
    DATE_ENVOI=$(date --date="$DATE_ENVOI"  +"%d %b %Y %H:%M:%S")
    2) Comment intégrer les 3 variables dans ma table Oracle (une fois la date reformatée comme je le veux) ?
    Pour cela, j'ai déjà mis en place un bout de code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
     
    # == Intégration des variables dans table Oracle
    #echo "--Mise à jour de la table Oracle";
    #sqlplus -S ${SAVAGE_CONNECT}  <<!!
    #set linesize 160
    #set pagesize 0
    #set feedback off
    #set termout off
    #set verify off
    #set echo off
    #set heading off
    #
    #insert into SAVAGE_MAIL (EXPEDITEUR, DESTINATAIRE, DATE_ENVOI) 
    #values (${EXPEDITEUR},${DESTINATAIRE},${DATE_ENVOI});
    #
    #
    #!!
    #
    #RETOUR=$?;
    #if [ ${RETOUR} != "0" ]
    #then
    #	msg="ERREUR ORACLE ${RETOUR} : insertion dans la table savage_mail KO";
    #	${SUIVI_ERREUR} ${ID_TRT} SQLPLUS ${msg};
    #	exit 1;
    #else
    #	msg="insertion dans la table savage_mail OK";
    #	${SUIVI_MESSAGE} ${ID_TRT} I ${msg};
    #fi

  14. #14
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par ElPibeOro Voir le message
    Voici mon code dans l'état actuel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    #!/bin/ksh
     
    [snip]
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    eval "$DATE_ENVOI"
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"
     
    varFrom=$(echo $EXPEDITEUR) # Ce qu'affiche la commande "echo" ira dans "varFrom" 
    varTo=$(echo $DESTINATAIRE)
    varDate=$(echo $DATE_ENVOI)
     
    echo $varFrom
    echo $varTo
    echo $varDate
    Comme indiqué plusieurs fois, tu peux simplifier le print + sprintf et, du même coup, supprimer l'appel à eval (eval is evil!).

    Et aussi, comme déjà indiqué dans mon post #8 supprimer les echo inutiles:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    #!/bin/ksh
     
    [snip]
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print varDate;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"
     
    varFrom=$EXPEDITEUR # Ce que contient la variable "EXPEDITEUR" ira dans la variable "varFrom" 
    varTo=$DESTINATAIRE
    varDate=$DATE_ENVOI
     
    echo $varFrom
    echo $varTo
    echo $varDate
    Tu peux aussi renommer tes variables EXPEDITEUR en varFrom (ou bien utiliser EXPEDITEUR dans la suite).

  15. #15
    Membre du Club
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    116
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 116
    Points : 66
    Points
    66
    Par défaut
    Tu as raison jack, le code est plus propre comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
     
    read EXPEDITEUR <<<$(awk -F "[<> ]" '/^From:/ {print $(NF-1)} ' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DESTINATAIRE=$(awk 'BEGIN {FS = ":";  varTo = "";  flag = 0;}
    $1 == "Subject" {flag=0;}
    flag == 1 {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = varTo ";" substr($0,vPdeb+1,vPfin-vPdeb-1) ";";}
    $1 == "To" {vPdeb=index($0,"<");vPfin=index($0,">"); varTo = substr($0,vPdeb+1,vPfin-vPdeb-1); flag=1;}
    END {print varTo;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
     
    DATE_ENVOI=$(awk 'BEGIN {FS = ":"; varDate = ""; flag = 0; vPdeb=0; vPfin=0;}
    $1 == "Date" {vPdeb=index($0,",")+1;vPfin=index($0,"+")-1; varDate = substr($0,vPdeb+1,vPfin-vPdeb-1);}
    END {print varDate;}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    #END {print sprintf("export DATE_ENVOI=\"%s\"",varDate);}' ${SAVAGE_HOME}/fichiers/SAV_AGENCE__91bc915d93b2803546aaf344ace9527cc9e3c06f5b7a1d2b19adeaf02893d01b.txt)
    #eval "$DATE_ENVOI"
     
    # == Reformatage de la date
    #DATE_ENVOI=$(DATE_ENVOI -d "+%d %m %Y")
    DATE_ENVOI=$(date --date="$DATE_ENVOI"  +"%d/%m/%Y %H:%M:%S")
     
     
    echo "EXPEDITEUR=${EXPEDITEUR}"
    echo "DESTINATAIRE=${DESTINATAIRE}"
    echo "DATE_ENVOI=${DATE_ENVOI}"
     
     
    # == Intégration des variables dans table Oracle
    echo "--Mise à jour de la table Oracle";
    sqlplus -S ${SAVAGE_CONNECT}  <<!!
    set linesize 160
    set pagesize 0
    set feedback off
    set termout off
    set verify off
    set echo off
    set heading off
     
    insert into SAVAGE_MAIL (EXPEDITEUR, DESTINATAIRE, DATE_ENVOI) 
    values ('${EXPEDITEUR}','${DESTINATAIRE}',to_date('${DATE_ENVOI}', 'DD/MM/YYYY HH24:MI:SS'));
    Tout fonctionne parfaitement ! Merci beaucoup à vous deux pour votre aide !

  16. #16
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 101
    Points : 5 849
    Points
    5 849
    Par défaut
    [EDIT] Oops! Pas assez rapide... [/EDIT]

    Citation Envoyé par ElPibeOro Voir le message
    1) Comment reformater la date pour l'avoir au format JJ/MM/AAAA HH/MM/SS ??
    Je souaite faire cette transformation avec Shell( et pas sous Oracle)
    J'ai essayé ça mais ça ne fonctionne pas :
    Le message "ça ne fonctionne pas" ne nous donne pas assez d'information :-(
    Y a-t-il un message d'erreur?
    Obtiens-tu un résultat différent de celui que tu espères?
    Si oui, lequel?
    En quoi cela ne te convient-il pas?
    etc.


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    # == Reformatage de la date
    DATE_ENVOI=$(date --date="$DATE_ENVOI"  +"%d %b %Y %H:%M:%S")
    Chez moi, ceci "fonctionne":
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ DATE_ENVOI='16 Jun 2014 14:45:08'
     
    $ DATE_ENVOI=$(date --date="$DATE_ENVOI"  +"%d/%m/%Y %H:%M:%S")
     
    $ echo "$DATE_ENVOI"
    16/06/2014 14:45:08

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Mise en forme des données sous Excel
    Par mhamedbj dans le forum Cognos
    Réponses: 2
    Dernier message: 27/08/2011, 16h00
  2. [2008] Mise en forme des données
    Par Valochette dans le forum SSRS
    Réponses: 2
    Dernier message: 12/05/2011, 09h34
  3. [MySQL] probleme de mise en forme des données
    Par arakiri dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 01/06/2007, 11h01
  4. [MySQL] Mise en forme des données
    Par Silborn dans le forum PHP & Base de données
    Réponses: 1
    Dernier message: 27/12/2006, 18h00
  5. Réponses: 6
    Dernier message: 16/06/2006, 14h20

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo