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 :

Parcourir un fichier log ligne par ligne et comparer des valeurs precises de chaque ligne


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Par défaut Parcourir un fichier log ligne par ligne et comparer des valeurs precises de chaque ligne
    Bonsoir chers membres éminents chrevronnés du bash

    Alors je viens vers vous aujourd'hui car j'ai un blocus sur un script bash que j'aimerai écrire. Je ne me suis pas vraiment orienté dans l'écriture de scripts bash Linux et j'aimerai pourtant en créer un afin d'analyser un fichier. Je pense m'y pencher plus sérieusement après ça.

    Alors, j'aimerais parcourir un fichier ligne par ligne et les comparer. Cependant, je dois comparer certaines valeurs sur des champs precis de chacune des lignes, c'est à dire comparer la ligne courante à la suivante et ainsi de suite. Voici mon fichier

    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
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |manger| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |dormir| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |rever| -
    mardi, 25 Decembre 2017 20:10:23 Paris|Fabrice| - |manger| -
    mardi, 25 Decembre 2017 20:40:13 Strasbourg|Paul| - |manger| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |dormir| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |rever| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |manger| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |manger| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |dormir| -
    mardi, 25 Decembre 2017 22:35:53 Pologne|Christian| - |rever| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |manger| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |dormir| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |parler| -
    mardi, 25 Decembre 2017 23:33:34 Casablanca|Benjim| - |rever| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |manger| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |dormir| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |rever| -
    En gros, voila mon fichier. Il affiche les noms de certaines personnes à des heures précises éxecutant une action précise. Ce que je veux c'est afficher les personnes qui éxecutent les actions manger, dormir, rever de façon successive à la même heure dc par exple Charles, Christian et Arno. Aucune autre action ne doit s'interposer entre elles comme c'est le cas de Benjim ou Paul (dont lheure nest pas la même pour les 3 actions)

    j'ai parcouru le forum et je suis tombé sur des sujets comme ce tuto pr parcourir un fichier ligne par ligne rédigé par le membre éminent N_Bah ou encore ce sujet qui explique comment couper un texte selon des critères mais cela ne m'a pas aidé peut être parce que je m'y prends mal.

    Alors, jai pensé créer un fichier qui devait contenir les heures uniquement que je pourrai utiliser pr comparer avec le fichier initial. Mais le soucis que j'ai c'est au niveau de l'implémentation car l'idée c'est de s'arreter et lire la 1ere ligne pour enregistrer les infos, ensuite aller à la ligne suivante pour comparer les valeurs, si c'est différent, enregistrer donc la valeur de la seconde ligne que j'irai comparer à celle de la 3e ligne etc. Par contre avec la procedure simple de la boucle while suivi de read, je n'ai pas le temps de traiter ligne par ligne sauf si je my prend mal . Raison pour laquelle je viens auprès des chevronnés de scripts tels que vous .

    Je vous remercie d'avance pour votre temps

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    Bonjour,

    avec la procedure simple de la boucle while suivi de read, je n'ai pas le temps de traiter ligne par ligne
    qu'est-ce que tu veux dire ?
    s'il n'y a pas d'informations enregistrées, c'est que tu es sur la première ligne, alors il faut enregistrer les données, et passer à la suivante.
    lors de la lecture des lignes suivantes, des informations ont été enregistrées, donc tu peux comparer les données de la ligne courante avec les informations enregistrées.
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Par défaut
    Merci pour ton intervention.

    qu'est-ce que tu veux dire ?
    En fait les scripts donnés m'affichent en résultat les lignes du fichier et ce n'est pas ce que je veux.

    s'il n'y a pas d'informations enregistrées, c'est que tu es sur la première ligne, alors il faut enregistrer les données, et passer à la suivante.
    En effet, lorsque je suis sur la première ligne, j'aimerai enregistrer lheure que je vais comparer à celle de la ligne suivante mais je ne sais pas comment car la commande awk ou cut prend les heures sur la colonne entiere (donc de toutes les lignes) et non pas sur la 1ere ligne uniquement. Donc ya t-il un moyen de croiser ligne et colonne pour recuperer uniquement la valeur que je veux? Mon idée n'est pas peut être pas la bonne, peut-être en avez-vous une meilleure. Au départ je pensais que le mieux serait de comparer les lignes entieres, mais étant donner les actions (manger, dormir, rever) qui doivent pas être identiques et que je dois peut être séparer avant la comparaison, alors je me dis que ca peut fausser le résultat.
    lors de la lecture des lignes suivantes, des informations ont été enregistrées, donc tu peux comparer les données de la ligne courante avec les informations enregistrées.
    N'étant pas un génie du bash, je t'avoue que n'ayant pas utilisé une variable pour le faire, je ne sais pas comment m'y prendre dans ce cas.
    Vous constaterez que je parle beaucoup plus sur la manière d'aborder le problème sans vous pondre le code. Ceci est dû au fait que je pense que la méthode (ou lalgo ) qui me vienne ne soit pas du tout bonne, c'est pourquoi j'aimerai d'abord avoir votre avis sur la bonne logique pour aborder ce problème et pour ce faire, je vous explique ce que je veux:

    En fait je veux pouvoir ressortir les noms des utilisateurs qui ont effectué successivement les action manger, dormir, rever à la même heure et ce sont les utilisateurs Charles, Christian et Arno dans le cas du fichier exemple. Mon fichier peut être plus long que celui-ci. Donc je veux pouvoir faire un script qui pourrait me lister les noms des personnes repondant à ces critères car je ne connaitrai pas toujours d'avance l'heure ou les noms des concernés dans le fichier pour une identification manuelle à cause de sa longueur.

    Cordialement

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    il n'y a pas lieu de faire appel à awk ou cut (je l'ai montré dans le tuto que tu cites).
    Citation Envoyé par NBaH
    Il est possible de découper la ligne en autant de variables que nécessaire.
    N'étant pas un génie du bash, je t'avoue que n'ayant pas utilisé une variable pour le faire, je ne sais pas comment m'y prendre dans ce cas.
    vas-y pas à pas.
    fais des petits essais pour assimiler la syntaxe du shell. il n'y a qu'en pratiquant que tu apprendras.

    un algorithme, ça ne s'écrit pas*, ça se dessine.

    quelle est la première information à comparer ? quelle est l'information, sur une ligne, qui fera qu'on sera sûr de devoir faire d'autres comparaisons, ou s'il faut passer à la ligne suivante ?

    *d'accord, ça s'écrit, mais avec du pseudo-code, pas comme une rédaction, et d'abord, on dessine un "arbre de décision".
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Membre expérimenté
    Homme Profil pro
    Inscrit en
    Mai 2011
    Messages
    192
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Cameroun

    Informations forums :
    Inscription : Mai 2011
    Messages : 192
    Par défaut
    il n'y a pas lieu de faire appel à awk ou cut (je l'ai montré dans le tuto que tu cites)
    Pour lire les lignes en effet
    vas-y pas à pas.
    fais des petits essais pour assimiler la syntaxe du shell. il n'y a qu'en pratiquant que tu apprendras.
    c'est ce que je fais en effet, merci
    un algorithme, ça ne s'écrit pas*, ça se dessine.
    Bon, dans mon cas, je voulais surtout parler du procédé ou du cheminement à suivre que vous pouvez me conseiller pour resoudre le problème par rapport à celui que je vous ai proposé.
    quelle est la première information à comparer ? quelle est l'information, sur une ligne, qui fera qu'on sera sûr de devoir faire d'autres comparaisons, ou s'il faut passer à la ligne suivante ?
    Je pense en effet que c'est ici qu'il y a tout mon blocus déjà et donc j'aimerai votre point de vue. En fait voici le procéde en espérant bien expliquer. Dans mon script bash, je dois ressortir les personnes qui respectent ces criteres:
    - avoir éxecuté les actions (manger, dormir, rever) dans la même seconde, minute et heure (les 3 actions doivent être effectuées dans la seconde de la minute+heure);
    - avoir executé les actions (manger, dormir, rever) successivement l'une après l'autre sans aucune autre action intermédiaire entre elles.

    C'est pourquoi je pense qu'après traitement de mon fichier, je dois avoir en resultat les noms Charles, Christian (léger doute) et Arno parce que:
    - à 19:50:50 exactement, Charles éxecute successivement les actions manger, dormir et rêver (pas réaliste je sais mais c'est un exemple )
    - à 22:35:53 exactement; Christian execute successivement les actions
    - à 23:45:54 exactement, Arno execute aussi successivement les mêmes actions

    Donc dans une première reflexion, je me disais que je dois comparer les temps de la 1ere ligne à la 2e pour voir s'ils sont identiques, si c'est le cas je dois voir si les personnes correspondent aussi, ensuite verifier que l'action du 1er temps est manger, celui du 2e est dormir et celui du 3e rever comme ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |manger| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |dormir| -
    mardi, 25 Decembre 2017 19:50:50 Rouen|Charles| - |rever| -
    Si jamais les temps ne sont pas les mêmes, alors je passe à la ligne suivante que je dois comparer avec celle qui la suit en suivant le même procédé et ainsi de suite comme ci-dessous.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    mardi, 25 Decembre 2017 20:10:23 Paris|Fabrice| - |manger| -
    mardi, 25 Decembre 2017 20:40:13 Strasbourg|Paul| - |manger| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |dormir| -
    mardi, 25 Decembre 2017 21:05:23 Dakar|Paul| - |rever| -
    Cependant, il m'a semblé que cela soit long, car je me suis rendu compte que les lignes qui respectent les critères sont quasi-idem à la difference des actions qui doivent se suivre. Donc du coup je pensais à comparer entièrement les lignes qui se suivent mais je ne sais pas comment faire (comparer) de l'action (dernier champs) qui forcement ne doit pas être le même dans la mesure ses critères sont spécifiques donc jamais idem. Dois-je l'extraire au moment de comparer les lignes? C'est pourquoi je vous sollicitais dans un premier temps sur la compréhension et la méthodologie avant de passer au script en lui même. Par exemple on voit bien que tout ce qui change c'est l'action et les autres champs sont idem
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |manger| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |dormir| -
    mardi, 25 Decembre 2017 23:45:54 Miami|Arno| - |rever| -
    Merci d'avance pour le temps que vous me consacrez et consacrerez

    EDIT: J'ai modifié les critères que doivent respecter mon script bash pour ajouter de nouveau éléments

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 664
    Par défaut
    l'exposé laisse croire qu'il y a une information à comparer avant l'autre, mais en fait non, c'est le couple "date/lieu"-"personne" qu'il faut comparer entre la ligne courante et la ligne précédente.

    ensuite, comment penses-tu gérer que "rever" doit apparaître après "dormir", qui doit, lui, être apparu après "manger" afin d'afficher le nom de la personne ?
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

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

Discussions similaires

  1. Parcourir un fichier .LOG
    Par tania_hf dans le forum SAS Base
    Réponses: 4
    Dernier message: 07/07/2014, 14h50
  2. Remplacer la 1er virgule de chaque ligne par une tabulation
    Par michel42 dans le forum Shell et commandes GNU
    Réponses: 2
    Dernier message: 16/05/2012, 17h12
  3. Réponses: 18
    Dernier message: 24/06/2011, 15h13
  4. [AC-2003] récupérer les valeur d'une textbox ligne par ligne
    Par 0sef40 dans le forum VBA Access
    Réponses: 5
    Dernier message: 07/06/2011, 09h22
  5. Réponses: 6
    Dernier message: 17/01/2007, 12h30

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