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 GNU Discussion :

Aide pour gestion de date


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Inscrit en
    Avril 2012
    Messages
    13
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Avril 2012
    Messages : 13
    Par défaut Aide pour gestion de date
    Bonjour,

    Je me permets de solliciter votre aide pour une petite problématique ...

    Contexte : Dans un fichier toto.txt j'ai une liste d'incidents, pour chaque ligne de ce fichier j'ai une date + un symbole de séparation "[" + un descriptif.

    But : J'aimerais crée un script qui efface automatiquement via un cron quotidien toutes les lignes qui ont plus de 30 jours, de façon a ne pas me retrouver avec un fichier monstre.

    Formatage du fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    26/10/12 18:02:23 [ SV050  jqw 
    26/10/12 18:24:20 [ SV029  jqw 
    03/11/12 20:58:32 [ SV010  jqw 
    21/11/12 21:40:48 [ SV010b  jqw 
    25/11/12 22:56:20 [ PR201  jqw
    J'ai bien en tete de faire un while pour la lecture ligne par ligne du fichier.
    De faire un test if sur la récupération de la variable date de la ligne par un cut.

    Mais je ne vois pas comment faire pour supprimer toutes les lignes qui ont plus de 30 jours ...

    Help sioux plaix !

  2. #2
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    tu te base sur la mise en forme de la date et avec un sed ou awk selon ce que tu préfères ou connais.

    tu vires les lignes correspondantes à date comparative du moi -1 (ne pas oublier de gerer le cas JANVIER !!! où il faut aussi calculer année -1.

    la j'efface la ligne avec la date du jour...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fpssl@fr:/local$ cat > toto
    26/10/12 18:02:23 [ SV050  jqw 
    26/10/12 18:24:20 [ SV029  jqw 
    03/11/12 20:58:32 [ SV010  jqw 
    21/11/12 21:40:48 [ SV010b  jqw
    30/11/12 22:33:11 [ SV10 jqw
    fpssl@fr:/local$ date=$(date +%d\\/%m\\/%y)
    fpssl@fr:/local$   sed -i  "/$date/ d" toto
    fpssl@fr:/local$ cat toto
    26/10/12 18:02:23 [ SV050  jqw 
    26/10/12 18:24:20 [ SV029  jqw 
    03/11/12 20:58:32 [ SV010  jqw 
    21/11/12 21:40:48 [ SV010b  jqw
    fpssl@fr:/local$ rm toto ; unset date
    t'as plus qu'a adapter

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

    Informations forums :
    Inscription : Avril 2012
    Messages : 13
    Par défaut
    Citation Envoyé par frp31 Voir le message
    tu te base sur la mise en forme de la date et avec un sed ou awk selon ce que tu préfères ou connais.

    tu vires les lignes correspondantes à date comparative du moi -1 (ne pas oublier de gerer le cas JANVIER !!! où il faut aussi calculer année -1.

    la j'efface la ligne avec la date du jour...
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    fpssl@fr:/local$ cat > toto
    26/10/12 18:02:23 [ SV050  jqw 
    26/10/12 18:24:20 [ SV029  jqw 
    03/11/12 20:58:32 [ SV010  jqw 
    21/11/12 21:40:48 [ SV010b  jqw
    30/11/12 22:33:11 [ SV10 jqw
    fpssl@fr:/local$ date=$(date +%d\\/%m\\/%y)
    fpssl@fr:/local$   sed -i  "/$date/ d" toto
    fpssl@fr:/local$ cat toto
    26/10/12 18:02:23 [ SV050  jqw 
    26/10/12 18:24:20 [ SV029  jqw 
    03/11/12 20:58:32 [ SV010  jqw 
    21/11/12 21:40:48 [ SV010b  jqw
    fpssl@fr:/local$ rm toto ; unset date
    t'as plus qu'a adapter

    Merci j'ai compris le principe ... reste que j'ai bcp de mal a jouer avec les dates en variable :/

    Mais je vais faire quelques tests et voir si je m'en sors

  4. #4
    Expert confirmé Avatar de frp31
    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2006
    Messages
    5 196
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juillet 2006
    Messages : 5 196
    Par défaut
    Citation Envoyé par Bhaalou Voir le message
    Merci j'ai compris le principe ... reste que j'ai bcp de mal a jouer avec les dates en variable :/

    Mais je vais faire quelques tests et voir si je m'en sors
    si tu veux te simplifier la vie tu peux aussi separer les trois champs de date le jour, le moi et l'annee

  5. #5
    Membre Expert
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    792
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mai 2004
    Messages : 792
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    # note: 2592000 = 3600*24*30 (30 jours en secondes)
    awk '{
    	dte=sprintf("20%s-%s-%s %s",$3,$2,$1,$4)
    	"date +%s -d\""dte "\"" | getline stamp
    	if (stamp+(2592000)>now) print
    }' now=$(date +%s) FS="[/ ]" fichier
    Ici pas de problème de passage d'année ni de mois. On retire 30 jours en secondes epoch.

    Tu peux éventuellement également utiliser la fonction gawk mktime si tu n'aimes pas les appels au shell depuis awk. Moins portable et moins rapide si mes souvenirs sont bons.

    Edit: version GNU awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    gawk '{
    	stamp=mktime(sprintf("20%s %s %s %s %s %s",$3,$2,$1,$4,$5,$6))
    	if (stamp+(2592000)>now) print
    }' now=$(date +%s) FS="[:/ ]"
    Après essai sur un gros fichier, je confirme que cette dernière version est deux fois plus lente que la version "Original Awk" avec getline.

Discussions similaires

  1. Aide pour calcul de date
    Par pedrosystem dans le forum Access
    Réponses: 9
    Dernier message: 06/07/2006, 08h38
  2. [Débutant]Besoin d'aide pour gestion d'exceptions
    Par H1B4K dans le forum Langage
    Réponses: 2
    Dernier message: 14/06/2006, 10h01
  3. aide pour récupération de date
    Par tribaleur dans le forum ASP
    Réponses: 5
    Dernier message: 31/05/2006, 15h09
  4. [C#]Aide pour gestion dataset / XML avec listview(débutant)
    Par Low-Fi dans le forum Windows Forms
    Réponses: 1
    Dernier message: 15/04/2006, 11h21
  5. [VB6]Aide pour mettre format date avec inputbox
    Par Geliwy77 dans le forum VB 6 et antérieur
    Réponses: 13
    Dernier message: 28/01/2006, 20h13

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