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 :

Lecture dans un fichier texte puis boucle


Sujet :

Shell et commandes POSIX

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 28
    Points
    28
    Par défaut Lecture dans un fichier texte puis boucle
    Bonjour

    Je suis un grand débutant dans shell et je ne sais pas comment faire ma routine.

    Je m'explique, j'ai besoin de faire un script qui lit un fichier txt qui est sous tel forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    141009
    demo
    121009
    test
    141209
    demo2
    Les lignes impaire correspondent à une date d'expiration

    Les lignes paire correspondent au dossier à supprimer

    Si je prend ligne 1 et 2 cela signifie que le dossier "demo" expire le 9/10/2014 (exprimé "ymd" dans le fichier)

    Mon but est de comparé date du jour et date expiration. Si date d'expiration > date du jour alors supprimer le dossier sinon ne rien faire.



    Pouvez vous m'aider à développer cette routine?

    Pour le moment j'ai pas réussi à faire grand chose à part cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    date1=$(date +%y%m%d)
    if ($date1 < $date_expiration) then
    else
    rm -r $dossier
    endif

    il me manque donc la lecture et extraction des données du fichier txt.

    Et ma boucle





    Merci par avance

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour,

    de quel shell s'agit-il ? je ne reconnais pas csh, ni sh, bash, ksh

    regarde ici

    ainsi que les liens dans ma signature ci-dessous.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2011
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2011
    Messages : 38
    Points : 28
    Points
    28
    Par défaut
    Merci pour ta réponse il s'agit du shell de mac os
    Pour simplifier j'ai fais mon fichier txt comme un csv du coup il est sous cette forme :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    141009;demo
    121009;test
    141209;demo2
    J'ai essayer de refaire le script quand je fais juste la boucle j'ai pas de problème cela fonctionne, mais lorsque j'ajoute une condition dans ma boucle (la comparaison de date) cela le marche plus. Voici à quoi cela ressemble

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    date1=$(date +%y%m%d)
    while IFS=';' read champ1 champ2
    do 
    if ($date1 < $champ1) then echo 'ok'
    else
    echo 'suppression'
    endif
    done < log.txt
    Peux tu m'aider une dernière fois j'ai vraiment du mal.
    Merci par avnce

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    date1=$(date +%y%m%d)
    while IFS=';' read champ1 champ2
    do 
       if test $date1 -lt $champ1
       then
          echo 'ok'
       else
          echo 'suppression'
       fi
    done < log.txt
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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.

    Merci pour ta réponse il s'agit du shell de mac os
    Dans ce cas il s'agit de Bash (v3 par défaut)

    Sinon tes structures if sont toujours incorrectes : endif n'existe pas, les conditions se font soit à l'aide de la commande test ou de ses équivalents [ ou [[ qui sont des builtins bash, soit à l'aide d'expression arithmétiques( (( var < var2 )) par exemple).

    Tu devrais te documenter un peu sur la syntaxe comme te l'a conseillé N_Bah.

    Cours complet sur la programmation «Shell»
    Quelques bonnes pratiques dans l'écriture de scripts en Bash
    Quelques exercices corrigés pour débuter
    Comment lire/parcourir un fichier ? (FAQ shell)

    Donc pour compléter un peu le code de N_Bah, voici :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    date1="$(date +%y%m%d)"
    # read -r un peu plus robuste car n'interprète pas les \
    while IFS=';' read -r champ1 champ2; do 
       # protéger ses variables en utilisant les " ou bien la syntaxe bash des doubles crochets
       # lire "comment protéger ses opérandes" => http://ineumann.developpez.com/tutoriels/linux/bash-bonnes-pratiques/#LI-B
       if [[ $date1 -lt $champ1 ]]; then
          echo "ok"
       else
          echo "suppression"
       fi
    done < log.txt
    Idriss

  6. #6
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Bonjour ok.Idriss,

    ici, les variables sont censés être des nombres (elles ne peuvent pas contenir d'espaces), il n'est alors pas nécessaire d'utiliser de protections.
    si elles ne le sont pas, dans tous les cas, le test fera échouer le script.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  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
    Citation Envoyé par N_BaH Voir le message
    ici, les variables sont censés être des nombres (elles ne peuvent pas contenir d'espaces), il n'est alors pas nécessaire d'utiliser de protections.
    si elles ne le sont pas, dans tous les cas, le test fera échouer le script.
    Il est vrai que -lt sur une valeur qui n'est pas numérique, ça plantera aussi, donc oui ça changera pas grand chose. Mais je me dit qu'il vaut mieux avertir le PO pour qu'il prenne l'habitude de rendre ses scripts robustes car rien n'indique qu'il maitrise le contenu du fichier ou encore les problèmes engendrés par les espaces même si ce n'est pas le cas dans son son fichier

    Pareil pour le read -r, je commence à systématiquement le mettre aussi même si ce n'est pas toujours justifié

  8. #8
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 552
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 552
    Points : 19 392
    Points
    19 392
    Par défaut
    Pareil pour le read -r, je commence à systématiquement le mettre aussi même si ce n'est pas toujours justifié
    c'est bien ça
    moi, j'attends le gadin pour m'y mettre systématiquement.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  9. #9
    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
    J'ai découvert l'option -r de read à l'occasion de l'écriture d'une fonction qui ne marchait pas sans cette option:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    function qbs() { if [ $# -gt 0 ] ; then l=$1; else read -r l; fi; echo "$l" | sed -e 's/\\/\\\\/g'; }
    Elle sert à transporter une commande du shell vers emacs, qui a besoin que les backslashs soient quotés et donc, au minimum, conservés.

    Par exemple:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ echo foo.bar | sed -e 's/\..*//'  # <- La commande qu'on voudrait donner à emacs
    foo
     
    $ qbs
    echo foo.bar | sed -e 's/\..*//'    # <- Ce que j'ai copié/collé (dans le shell)
    echo foo.bar | sed -e 's/\\..*//'   # <- Ce que 'qbs' a produit ("read -r" obligatoire!), à copier/coller dans emacs
    Conclusion: l'option -r de read, si elle est parfois utile, peut aussi être parfois indispensable!

Discussions similaires

  1. Lecture dans un fichier texte.
    Par tazthedev dans le forum Delphi
    Réponses: 4
    Dernier message: 31/10/2006, 16h07
  2. Réponses: 4
    Dernier message: 23/03/2006, 17h12
  3. Réponses: 6
    Dernier message: 23/02/2006, 12h09
  4. [ASP] Lecture dans un fichier texte
    Par thoomis dans le forum ASP
    Réponses: 3
    Dernier message: 23/11/2005, 15h08
  5. [Débutant] Lecture dans un fichier texte
    Par babemagus dans le forum Entrée/Sortie
    Réponses: 10
    Dernier message: 07/07/2005, 12h17

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