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 :

Analyse des lignes d'un fichier et copie dans de nouveaux fichiers en fonction de la date


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut Analyse des lignes d'un fichier et copie dans de nouveaux fichiers en fonction de la date
    Bonjour à toutes et tous,
    J'ai un dossier rempli de fichiers journaux de login des pc de mon réseau.
    Je souhaiterais parcourir toutes les lignes de chaque fichiers et copier celles-ci en fonction de la date.
    Voici un exemple de ligne:
    12-08-2021 13:15:09,login,admin,,XXXX,IPDeLaMachine

    J'arrive a parcourir le dossier, a parcourir les lignes des fichiers mais... :'(

    J'ai énormément de mal a segmenter ma chaine de caractère pour récuperer la date servant a créer/ajouter à un fichier.

    Voici le code utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/bin/bash
    for fich in `ls`
    do
    	echo $fich
    	while read ligne
    		do {
    			date=    // C est ici que je bloque
    			echo $date
    		}
    	done < $fich
    done
    La finalité est de quantifier l'utilisation journalière de mon parc par différents services.
    Toute proposition constructive est la bienvenue.
    Merci à vous qui avez lu ceci et un autre merci à ceux qui pourront m'aider.

    Bien à vous et bonne journée à toutes et tous.

  2. #2
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Bonjour

    • ls, c'est bien en console. Dans un script, on décourage cette mauvaise pratique. ls sera avantageusement remplacé par find et/ou stat.
    • Les accolades dans while do ;done ne servent à rien puisque ce qui tient lieu de début de boucle et fin de boucle est "do" et "done".
    • Ensuite, plutôt que de lire la ligne, tu peux être plus précis puisque tu connais le séparateur de champ.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      while IFS=',' read horodatage reste; do
      .
    • Enfin, tu as malheureusement la date stockée à la française. Il faut manipuler pour que la commande date te donne tout ce que tu veux.
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      6
      $ sed 's@\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9][0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)@\3-\2-\1 \4:\5:\6@' <<<"12-08-2021 13:15:09"
      2021-08-12 13:15:09
      $ date -d "$(sed 's@\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9][0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)@\3-\2-\1 \4:\5:\6@' <<<"12-08-2021 13:15:09")"
      jeudi 12 août 2021, 13:15:09 (UTC+0200)
      $ date -d "$(sed 's@\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9][0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)@\3-\2-\1 \4:\5:\6@' <<<"12-08-2021 13:15:09")" +"%s"
      1628766909
      Code : Sélectionner tout - Visualiser dans une fenêtre à part
      1
      2
      3
      4
      5
      while IFS=',' read horodatage reste
      do
          madate=$(sed 's@\([0-9][0-9]\)-\([0-9][0-9]\)-\([0-9][0-9][0-9][0-9]\) \([0-9][0-9]\):\([0-9][0-9]\):\([0-9][0-9]\)@\3-\2-\1 \4:\5:\6@' <<<"$horodatage")
          date -d"$madate" +"%s"
      done
      C'est un exemple incitatif. À toi de jouer

  3. #3
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    Merci Flodelarab d'avoir pris le temps de me lire et de me répondre.

    Je ne manipule en aucun cas la commande date, je souhaite juste récupérer les 10 premier caractères de chaque lignes qui forme la date de connexion/déconnexion au pc.
    Ensuite, j'ajoute la ligne dans un nouveau fichier pour connaître approximativement le nombre de pc connecter ce jour la.

    J'étais assez perdu mais je pense que ta réponse me mets sur la voie de l'utilisation de `sed` qui devrait pouvoir me sauver. Je n'ai "plus qu'a" la comprendre et l'étudier sous toutes ses coutures.

    Belle journée.

  4. #4
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o '^[^ ]*' fichier.txt | sort | uniq -c

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par Waldorf Voir le message
    je souhaite juste récupérer les 10 premier caractères de chaque ligne
    Il me semble que, pour ce genre d'utilisation, il y a la commande man cut.

  6. #6
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    Merci à toutes et tous d'avoir pris du temps pour me lire eet m'aider.

    Finallement, la solution se trouvait complètement ailleurs:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #!/bin/bash
    for fich in `ls`
    do
            while read ligne
                    do {
                            jour=${ligne%' '*}       #recupere les valeurs situés à gauche de l'espace dans la variable ligne 
                            touch ./LogDate/$jour.txt;
                            echo $ligne >> ./LogDate/$jour.txt;
                    }
            done < $fich
    done
    Reste a affiner en vérifiant que cette partie est bien au format date (dans mon cas)

    Pour la partie de droite, je n'ai pas fait attention...

  7. #7
    Futur Membre du Club
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Mai 2013
    Messages
    4
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Mai 2013
    Messages : 4
    Par défaut
    REponse trouver dans cette discution:
    https://www.developpez.net/forums/d2...ation-chaines/

  8. #8
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 294
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 294
    Par défaut
    Citation Envoyé par Waldorf Voir le message
    Finallement, la solution se trouvait complètement ailleurs:
    Et non. La solution que tu as ramenée est mauvaise. Tu refabriques artificiellement ce que read fait naturellement. Quand on fait while read madate lereste;do echo "madate"; done, la variable $madate contient la date sans avoir à re-partitionner après comme tu le fais maladroitement. La variable $lereste contient le reste de la ligne.

    Je me demande pourquoi les internautes viennent poser des questions; ils lisent rarement les réponses.

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

Discussions similaires

  1. Copie des lignes d'un fichier EXCEL vers un autre sous condition
    Par Nonid dans le forum Macros et VBA Excel
    Réponses: 1
    Dernier message: 10/01/2019, 11h52
  2. Comment supprimer des lignes d'un fichier en fonction d'un autre fichier
    Par Ohemeg dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 21/04/2009, 13h56
  3. Shell pour supprimer des lignes d'un fichier
    Par nelsa dans le forum Autres langages
    Réponses: 2
    Dernier message: 20/09/2004, 12h26
  4. Extraire des lignes d'un fichier en commande bash
    Par newnew dans le forum Linux
    Réponses: 3
    Dernier message: 27/07/2004, 16h22
  5. Réponses: 4
    Dernier message: 24/04/2003, 22h28

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