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 :

Question avec un GREP


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Avril 2006
    Messages : 288
    Par défaut Question avec un GREP
    Bonjour,

    Dans un fichier je récupére toutes les lignes d'un fichier log contenant le mot 'ERROR' .

    Dans chacune des lignes récupérées il y a la date, plusieurs mots, ainsi que le chemin absolue du fichier ayant causé l'erreur.

    J'aimerais pour chacune des lignes récupéré uniquement le fin de la ligne a partir du mot ERROR, mais je n'y arrive pas.

    Voila mon code :

    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
     
    #!/bin/bash
    clear
     
    if [ $# != 2 ] 
    then
    	echo "SYNTAXE : ./searchError.sh fichierSource fichierDestination"
    	exit 2
    else
    	if [ -f "$2" ]
    	then
    		touch "$2"
    	else
    		sed -n '/ERROR /p' "$1" > "$2" | grep "^ERROR"
    	fi
    fi

  2. #2
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Par défaut
    Pas besoin de grep :

  3. #3
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    ou alors
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep "^ERROR " $1 | cut -c 7-
    sans doute plus rapide que sed... mais bon, c'est pour chipoter =) sur des fichiers de quelques mégas, ça ne se verra pas...

  4. #4
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Bonjour,

    Le problème n'est pas très clair. Je suppose que:

    • le mot "ERROR" peut apparaître n'importe où,
    • il faut écrire tout ce qu'il y a après le mot "ERROR"

    Une commande qui marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk '{gsub(".*ERROR ", ""); print}' fichier_entree > fichier_sortie

  5. #5
    Membre émérite Avatar de jmelyn
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Septembre 2007
    Messages
    703
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux

    Informations forums :
    Inscription : Septembre 2007
    Messages : 703
    Par défaut
    Avec les mêmes hypothèses et en utilisant sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.*ERROR \(.*\)/\1/' fichier_entree > fichier_sortie

  6. #6
    Membre très actif

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Par défaut
    mmhh, bonne remarque, j'étais parti sur l'exemple donné par l'auteur de la question :p

    Cela étant, ta commande avec sed ne va pas virer les lignes qui ne contiennent pas ERROR ! Il faut au moins ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/.*ERROR \(.*\)/\1/p'
    En revanche, pas la peine d'avoir les parenthèses et le \1:
    C'est quand même plus rapide !

    De plus, j'aurais tendance à sécuriser un peu la chose pour éviter de retourner des mots comme SYSERROR ou ERRORTOTAL ou autres (bien que le problème initial n'en tienne pas compte) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n 's/.*\bERROR\W//p' $1
    Par exemple...

    Mais encore une fois, grep sera plus rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -o "\bERROR\W.*" test |cut -c 7-
    Les \W étant à adapter en fonction du format des erreurs possibles...

    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
    $ wc -l test
    10000000 test
    $ time grep -o "\bERROR\W.*" test |cut -c 7- > test_grep
    real    0m26.637s
    user    0m4.860s
    sys     0m19.270s
    $ time sed -n 's/.*\bERROR\W\(.*\)/\1/p' test > test_sed1
    real    1m45.931s
    user    1m4.990s
    sys     0m39.000s
    $ time sed -n 's/.*\bERROR\W//p' test > test_sed2
    real    1m37.064s
    user    0m53.720s
    sys     0m38.950s
    $ diff test_sed2 test_sed1
    $ diff test_sed2 test_grep
    $ wc -l test_*
     1428571 test_grep
     1428571 test_sed1
     1428571 test_sed2
     4285713 total

Discussions similaires

  1. [Ajax] question avec onreadystatechange
    Par lhulard dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 06/06/2006, 14h46
  2. [VB6] Petite question avec "select case ... end case"
    Par Lucas42 dans le forum VB 6 et antérieur
    Réponses: 22
    Dernier message: 04/05/2006, 10h24
  3. Petite question avec Procédure??
    Par STRUFIELD dans le forum VB 6 et antérieur
    Réponses: 3
    Dernier message: 07/12/2005, 09h12
  4. Questions avec les menus
    Par Baptiste Wicht dans le forum Agents de placement/Fenêtres
    Réponses: 6
    Dernier message: 02/12/2005, 20h57

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