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 :

Trapper un mot dans un fichier de type log et écrire dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut Trapper un mot dans un fichier de type log et écrire dans un fichier
    Bonjour,

    Je dispose d'un fichier log qui s'alimente à chaque instant, et lorsqu'un mot donné apparaît sur une ligne, je souhaiterais copier la ligne où apparaît la mot dans un fichier et ainsi de suite.

    Exemple simple pour comprendre :

    Fichier my_log en question :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    service auditd redémarré le 19:04:2021 à 17H30
    service ntpd redémarré le 19:04:2021 à 17H31
    service snmpd redémarré le 19:04:2021 à 17H32
    service postfix redémarré le 19:04:2021 à 17H33
    service https redémarré le 19:04:2021 à 17H34
    Je voudrais que lorsqu'une ligne contenant ntpd ou https apparaît, la ligne en question soit copiée dans un fichier à part :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    service ntpd redémarré le 19:04:2021 à 17H31
    puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    service ntpd redémarré le 19:04:2021 à 17H31
    service https redémarré le 19:04:2021 à 17H34
    ... et ainsi de suite.....

    Donc un petit script qui check my_log et qui "trappe" les lignes contenant des mots clés.

    Merci pour vos idées.

  2. #2
    Modérateur
    Avatar de al1_24
    Homme Profil pro
    Retraité
    Inscrit en
    Mai 2002
    Messages
    9 136
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 64
    Localisation : France, Val de Marne (Île de France)

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

    Informations forums :
    Inscription : Mai 2002
    Messages : 9 136
    Par défaut
    Ce n'est pas ce que permet grep ?
    Modérateur Langage SQL
    Règles du forum Langage SQL à lire par tous, N'hésitez pas à consulter les cours SQL
    N'oubliez pas le bouton et pensez aux balises
    [code]
    Si une réponse vous a aidé à résoudre votre problème, n'oubliez pas de voter pour elle en cliquant sur
    Aide-toi et le forum t'aidera : Un problème exposé sans mentionner les tentatives de résolution infructueuses peut laisser supposer que le posteur attend qu'on fasse son travail à sa place... et ne donne pas envie d'y répondre.

  3. #3
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci pour ta réponse.
    Je souhaite envoyer une commande qui check en permanence le fichier log… Tu voudrais dire d’envoyer une commande GREP toutes les cinq secondes par exemple ?

  4. #4
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    la commande tail -f .... | grep .... >fichier.log le tout encapsulé dans un nohup devrait le faire.

  5. #5
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci beaucoup.

    Le but est de lancer la commande, qu'on en entende plus parler et qu'elle "fasse le job".

    Donc en ligne de commande, on pourrait donc lancer la commande :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    nohup tail -f log.txt | grep "toto" >> my_journal.txt &
    Chaque fois que "toto" apparaît dans le fichier log.txt, la ligne contenant "toto" est copiée dans le fichier my_journal.txt.

    Le "&" combiné au "nohup" permet de lancer la commande en arrière plan… j'aurais préféré via un script…. comment faire ?

  6. #6
    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 kevin066 Voir le message
    j'aurais préféré via un script…. comment faire ?
    Je ne suis pas sûr de bien comprendre ce que tu veux dire par "j'aurais préféré via un script"

    Que veux-tu d'autre que :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo 'nohup tail -f log.txt | grep "toto" >> my_journal.txt &' > ./my_script.sh
    chmod +x ./my_script.sh
    ./my_script.sh

  7. #7
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Bonjour,

    Le script étant désormais OK, j'obtiens un fichier du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    26/04/2021 08:05:39 SERVER1 service1
    26/04/2021 08:05:52 SERVER1 service2
    26/04/2021 08:08:11 SERVER2 service3
    26/04/2021 08:08:24 SERVER1 service1
    26/04/2021 08:08:35 SERVER1 service1
    26/04/2021 08:09:48 SERVER1 service1
    26/04/2021 08:10:01 SERVER2 service3
    26/04/2021 08:11:15 SERVER1 service1
    26/04/2021 08:12:01 SERVER2 service3
    26/04/2021 08:13:50 SERVER2 service2
    Comme on peut le voir :

    - sur le SERVER1 : service1 apparaît plusieurs fois
    - sur le SERVER 2 : service3 apparaît plusieurs fois

    Ils figurent en double dans le fichier et je souhaite garder le dernier évènement (le plus récent) pour chacun d'entre eux, c'est à dire :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    26/04/2021 08:05:52 SERVER1 service2
    26/04/2021 08:11:15 SERVER1 service1
    26/04/2021 08:12:01 SERVER2 service3
    26/04/2021 08:13:50 SERVER2 service2
    Avez-vous une idée de comment on peut faire ?

    Merci.

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    tac | awk '!vu[$3$4]++' | tac

  9. #9
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Bonjour et merci

    Voilà le retour de ta commande :

    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
    SERVER5:kevin:/home/kevin>cat toto.txt
    26/04/2021 08:05:39 SERVER1 service1
    26/04/2021 08:05:52 SERVER1 service2
    26/04/2021 08:08:11 SERVER2 service3
    26/04/2021 08:08:24 SERVER1 service1
    26/04/2021 08:08:35 SERVER1 service1
    26/04/2021 08:09:48 SERVER1 service1
    26/04/2021 08:10:01 SERVER2 service3
    26/04/2021 08:11:15 SERVER1 service1
    26/04/2021 08:12:01 SERVER2 service3
    26/04/2021 08:13:50 SERVER2 service2
    SERVER5:kevin:/home/kevin>
    SERVER5:kevin:/home/kevin>cat toto.txt | tac | awk '!vu[$3$4]++' | tac
    26/04/2021 08:05:52 SERVER1 service2
    26/04/2021 08:11:15 SERVER1 service1
    26/04/2021 08:12:01 SERVER2 service3
    26/04/2021 08:13:50 SERVER2 service2
    Je te remercie, j'aurais pas su

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293
    Par défaut
    Sans débauche de processus :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{vu[$3$4]=$0;} END{for (i in vu) print vu[i];}'

  11. #11
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Juste question comme ça:

    Tu remplis un fichier potentiellement de plusieurs milliers de lignes et tu ne t'intéresses qu'au dernières occurrences ?

    Si c' est le cas, il serait peut-être intéressant d'utiliser le dernier awk de Flodelarab pour que celui-ci réinitialise le fichier et n'écrive que le tableau qu'il initie dés que celui-ci change comme ça tu n'aurais que les dernières valeurs à l'instant t.

  12. #12
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Bonjour,

    Il fonctionne parfaitement bien merci encore.


    Résultat de mon petit reporting (liste des services redémarrés par serveur) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    03/05/2021 10:27:07 SERV1 auditd
    03/05/2021 11:42:11 SERV2 ntpd
    03/05/2021 07:39:02 SERV1 auditd
    03/05/2021 11:43:48 SERV3 httpd
    03/05/2021 10:28:16 SERV2 ntpd
    03/05/2021 11:12:36 SERV2 ntpd
    En ne gardant que le dernier évènement de chaque type par serveur (l'heure à laquelle le service a redémarré la dernière fois) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    03/05/2021 10:27:07 SERV1 auditd
    03/05/2021 11:42:11 SERV2 ntpd
    03/05/2021 11:43:48 SERV3 httpd
    Comment faire apparaître malgré tout les infos ci-dessous ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Au total,
    - auditd relancé 2 fois sur SERV1
    - ntpd relancé 3 fois sur SERV2 
    - httpd relancé 1 fois sur SERV3
    Pour par exemple faire remonter que ntpd a redémarré 3 fois ?

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 293

  14. #14
    Membre confirmé
    Homme Profil pro
    Analyse système
    Inscrit en
    Août 2020
    Messages
    160
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : Analyse système
    Secteur : Industrie

    Informations forums :
    Inscription : Août 2020
    Messages : 160
    Par défaut
    Merci.

    Je ne connais pas du tout cette commande, comment s’utilise-t-elle ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    Mon fichier toto.txt vu précédemment :
    03/05/2021 10:27:07 SERV1 auditd
    03/05/2021 11:42:11 SERV2 ntpd
    03/05/2021 07:39:02 SERV1 auditd
    03/05/2021 11:43:48 SERV3 httpd
    03/05/2021 10:28:16 SERV2 ntpd
    03/05/2021 11:12:36 SERV2 ntpd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat toto.txt | awk 'nb[$3$4]++' :
    03/05/2021 07:39:02 SERV1 auditd
    03/05/2021 10:28:16 SERV2 ntpd
    03/05/2021 11:12:36 SERV2 ntpd
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat toto.txt | awk '!nb[$3$4]++' :
    03/05/2021 10:27:07 SERV1 auditd
    03/05/2021 11:42:11 SERV2 ntpd
    03/05/2021 11:43:48 SERV3 httpd
    Comment utilise t-on cette commande ?

    Je profite de l'occasion, suite à ces tests, pour revenir sur un des points vu la semaine dernière => ne faire ressortir que l'évènement le plus récent :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    cat toto.txt | awk '{vu[$3$4]=$0;} END{for (i in vu) print vu[i];}' : 
    03/05/2021 11:12:36 SERV2 ntpd
    03/05/2021 07:39:02 SERV1 auditd
    03/05/2021 11:43:48 SERV3 httpd
    Je vois qu'il y a un souci car le plus récent est "03/05/2021 10:27:07 SERV1 auditd"et non "03/05/2021 07:39:02 SERV1 auditd".

    Comment corriger cela dans dans le awk '{vu[$3$4]=$0;} END{for (i in vu) print vu[i];}' ?

    En revanche, de mon côté j'ai trouvé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    awk '!vu[$3$4]++' toto.txt
    03/05/2021 10:27:07 SERV1 auditd
    03/05/2021 11:42:11 SERV2 ntpd
    03/05/2021 11:43:48 SERV3 httpd
    Ca semble fonctionner, qu'en pensez-vous ?

    Merci

  15. #15
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 371
    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 371
    Par défaut
    Juste pour information, lorsque l'on utilise une date, le mieux est de la mettre sous une forme AAAAMMJJHHMMSS car pour une ordinateur, c'est plus simple de trier un nombre qui devient de plus en plus grand au fur et à mesure que le temps s'écoule...

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

Discussions similaires

  1. Ecrire une ligne dans un fichier de log
    Par Carmichael dans le forum C++Builder
    Réponses: 1
    Dernier message: 12/09/2018, 13h35
  2. Ecrire sur une ligne dans un fichier texte
    Par 1euro dans le forum Ruby
    Réponses: 4
    Dernier message: 18/05/2017, 18h51
  3. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 16h23
  4. [langage] Effacer une ligne dans un fichier
    Par sebi77 dans le forum Langage
    Réponses: 2
    Dernier message: 01/01/2005, 12h43
  5. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

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