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 :

Grep un peu particulier


Sujet :

Shell et commandes GNU

  1. #1
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut Grep un peu particulier
    Bonjour à tous,

    Voila j'ai un log du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
                    Thu Jun 14 08:26:06 2007
    08:26:06 Ligne1....
    08:26:06 Ligne2....
    08:26:09 Ligne3.....
    09:30:00 ERROR.....
    ....
                    Fri Jun 15 08:30:06 2007
    08:30:06 Ligne1....
    08:30:06 Ligne2....
    08:30:09 Ligne3.....
    09:35:00 ERROR.....
    .....
    (C'est du log progress...)


    Ce log contient plusieurs années de trace. J'aimerais faire un grep du type :
    mais qu'il m'affiche en plus des lignes trouvées, la date qui se situe plusieurs lignes avant.

    Avez-vous une idée ?

    Merci par avance,

  2. #2
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 3,4p mon_fichier
    affiche les lignes 3 et 4 de mon_fichier

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -n monmotif mon_fichier
    indique le numéro de ligne qui correspond plutôt que la ligne.

    Il y a moyen d'associer ces commandes et d'y adjoindre une petit soustraction pour arriver à ce que tu veux faire...

    Mais je crois qu'il y a aussi une option de grep pour faire ça plus simplement.
    edit:
    peut être ?
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  3. #3
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Attention : Le nombre de ligne entre la ligne "ERROR" et la date est variable !
    Sinon cela serait trop simple !

    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
     
                    Thu Jun 14 08:26:06 2007
    08:26:06 Ligne1....
    08:26:06 Ligne2....
    08:26:09 Ligne3.....
    09:30:00 ERROR.....
    ....
                    Fri Jun 15 08:30:06 2007
    08:30:06 Ligne1....
    08:30:06 Ligne2....
    08:30:09 Ligne3.....
    08:30:09 Ligne4.....
    .....
    .....
    09:35:00 ERROR.....
    .....

  4. #4
    Modérateur
    Avatar de ggnore
    Profil pro
    Inscrit en
    Juillet 2004
    Messages
    2 472
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juillet 2004
    Messages : 2 472
    Par défaut
    je ne comprend pas ce qui te bloque.
    tu n'arrives pas à faire la différence entre les deux numéros de ligne ?
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ echo "1 + 2" | bc
    3
    Peut être un problème d'algorithme ?
    Toutes les vertus des hommes se perdent dans l’intérêt comme les fleuves se perdent dans la mer.
    N'oubliez pas de consulter les FAQ Linux et les cours et tutoriels Linux

  5. #5
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Solution en Sed pur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^    /h; /ERROR/{x;p;x;p;}'
    T'as juste à corriger la regexp qui match la date (ici, je prends toute ligne qui commence par 4 espaces). La sortie affiche pour chaque erreur trouvée : la dernière date vue et la ligne d'erreur.

    Ca me semble plus efficace que de faire un script shell qui calcule les lignes. Le script fera rapidement plus de 10 lignes pour bien gérer ça (surtout si on travaille sur un flux potentiellement infini).

  6. #6
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Absolument merveilleux !!!

    Si je peut abuser :

    Je passe ta commande sur plusieurs fichiers :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    sed -n '/^    /h; /ERROR/{x;p;x;p;}' *.log
    Est-il possible d'afficher en plus le nom du fichier en cours d'analyse ?

  7. #7
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    Non, pas avec Sed. Il faut passer par le Shell.
    Code ZSH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i (*.log) sed -ne "/^    /{s//[$i] &/;h;}" -e '/ERROR/{x;p;x;p;}' $i

    Code ZSH, Bash, sh... : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in *.log; do
        sed -ne "/^    /{s//[$i] &/;h;}" -e '/ERROR/{x;p;x;p;}' $i
    done

    Et oui, Sed est un outil merveilleux.

  8. #8
    Membre émérite Avatar de valefor
    Profil pro
    Inscrit en
    Décembre 2006
    Messages
    711
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2006
    Messages : 711
    Par défaut
    Sinon avec egrep tout seul : tu spécifies une regexp qui matche la ligne contenant la date et la ligne contenant le error.

  9. #9
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Citation Envoyé par LLB
    Non, pas avec Sed. Il faut passer par le Shell.
    Code ZSH : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    for i (*.log) sed -ne "/^    /{s//[$i] &/;h;}" -e '/ERROR/{x;p;x;p;}' $i

    Code ZSH, Bash, sh... : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    for i in *.log; do
        sed -ne "/^    /{s//[$i] &/;h;}" -e '/ERROR/{x;p;x;p;}' $i
    done

    Et oui, Sed est un outil merveilleux.
    En fait, j'ai voulu mettre cela dans un script et je suis pommé. Toujours les " ou '. Dans quel cas mettre l'une ou l'autre ? Pourquoi dans un script shell cela ne fonctionne pas ?

  10. #10
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Citation Envoyé par valefor
    Sinon avec egrep tout seul : tu spécifies une regexp qui matche la ligne contenant la date et la ligne contenant le error.
    Oui, mais j'ai plein de date ou je n'ai pas 'ERROR'.

  11. #11
    LLB
    LLB est déconnecté
    Membre émérite
    Inscrit en
    Mars 2002
    Messages
    968
    Détails du profil
    Informations forums :
    Inscription : Mars 2002
    Messages : 968
    Par défaut
    À l'intérieur des double quotes, l'expansion des variables est faite. À l'intérieur des simple quotes, aucune expansion n'est faite.

    Si tu mets $i à un endroit, assure-toi qu'il n'est pas dans une chaine entre ' '. J'ai testé le code que j'ai donné, il marche bien dans un script (prends le 2e donné).
    Sinon avec egrep tout seul
    À mons que tu me montres le contraire, j'en doute fortement. Il peut y avoir une date sans erreur associée ; ou bien plusieurs erreurs à la même date.

  12. #12
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    Arf... Je suis mauvais.
    Voici mon script :

    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
    19
    20
    21
     
    #!/bin/bash
    if [ -z "$1" ]
      then
        echo "Chaine a rechercher : "
        read CHAINE
      else
        export CHAINE=$1
    fi
    if [ -z "$2" ]
      then
        echo "Fichiers ($DBALOG/cumul_prodepot*.lg) : "
        read FIC
      else
        export FIC=$2
    fi
     
    for i in $FIC;
    do
        sed -ne "/^    /{s//[$i] &/;h;}" -e "/$CHAINE/{x;p;x;p;}" $i
    done
    Losrque j'execute j'ai l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $ ./PPFind.sh ERROR MonLog.lg
    sed: -e expression #1, char 14: Unknown option to `s'

  13. #13
    Membre éclairé
    Inscrit en
    Décembre 2002
    Messages
    438
    Détails du profil
    Informations forums :
    Inscription : Décembre 2002
    Messages : 438
    Par défaut
    J'ai compris mon erreur.

    En fait, la cmde que j'executé était :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ ./PPFind.sh ERROR /data/MonLog.lg
    /data/MonLog.g : les "/" foutent la merde.

    Merci pour tout,

  14. #14
    Membre éprouvé
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    137
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 137
    Par défaut
    Citation Envoyé par LLB
    Solution en Sed pur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/^    /h; /ERROR/{x;p;x;p;}'
    Respect total

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

Discussions similaires

  1. [XSLT]Tableau un peu particulier
    Par JohnBlatt dans le forum XSL/XSLT/XPATH
    Réponses: 3
    Dernier message: 21/06/2006, 18h14
  2. Un tri un peu particulier
    Par GregPeck dans le forum Requêtes
    Réponses: 3
    Dernier message: 08/06/2006, 15h32
  3. Menu un peu particulier avec des onmouseover
    Par Jinroh77 dans le forum Général JavaScript
    Réponses: 6
    Dernier message: 21/02/2006, 14h30
  4. #define un peu particulier
    Par greuh dans le forum C
    Réponses: 14
    Dernier message: 12/10/2005, 16h42
  5. Réponses: 2
    Dernier message: 05/01/2004, 11h23

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