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 :

sed pour extraire un journal


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut sed pour extraire un journal
    Salut ^^

    Ca fait plusieurs jours maintenant que je me casse les dents sur sed, à essayer d'écrire une commande viable mais en vain.
    Voici mon problème :

    J'ai un fichier log dans lequel mes entrées sont de la forme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /// INITIALISATION ///
    ligne 1
    ligne 2
    etc ..
    /// INITIALISATION ///
    ligne 1
    ligne 2
    etc ..
    Ce que je voudrais faire, c'est un script me permettant de récupérer un certain block de lignes (c'est a dire entre /// INITIALISATION /// et la prochaine occurence de /// INITIALISATION ///).
    La condition pour récupérer ce block de ligne est de savoir si à l'interieur il y a au moins 1 occurence d'un pattern X.

    Je suis arrivé à selectionner chaque block de ligne avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/INITIALISATION/,/INITIALISATION/{/INITIALISATION/b; /INITIALISATION/b; /.*/p}' log
    Mais sans parler du fait qu'il me manque le dernier block du fichier (oui car a la fin du fichier il n'y a pas de ligne avec /INITIALISATION/), j'arrive pas à trouver un moyen de tester si mon pattern apparait dans le block ou pas xD

    C'est pas facile sed, surtout quand on connait pas xD C'est pour ça que j'ai besoin de votre aide !

    Merci d'avance <3

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    tu peux fournir un exemple de fichier et l'output à obtenir/le pattern à matcher stp ?

  3. #3
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    Yes !

    Voila en entree :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    /// INITIALISATION ///
    Une cuillère en inox
    Mon écran d ordi
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Un avion rouge
    Des chaussures usées
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Le pattern serais le mot "jolie"

    Et la sortie serais donc chaque block contenant au moins une fois le mot "jolie" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir

  4. #4
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut sed, c'est bien ;)
    Salut,

    Le fichier de départ :
    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
    $ cat plop 
    /// INITIALISATION ///
    Une cuillère en inox
    Mon écran d ordi
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Un avion rouge
    Des chaussures usées
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Le script sed :
    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
    #n
    \#INITIALISATION# {                    
        h
        :A
        N
        \#\n/// INITIALISATION#! {
            $ b B
            b A
        }
        s#\(.*\)\n.*#\1#
        \#jolie# {
            p
        }
        g    
    }
        b A
        :B
        \#jolie# {
            p
        }

    L'exécution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ sed -f script2.sed plop 
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Les explications, demain

  5. #5
    Membre actif
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Par défaut
    La vache !
    Non franchement respect, je suis impressionné ^^
    J'ai hâte d'avoir les explications :p

    En tout cas merci beaucoup !!
    Je pense que ça va m'aider a en apprendre un peu plus sur sed

    Bonne soirée

  6. #6
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Les explications plutôt que prévu ;-))

    #n On n'affiche sur la sortie standard que sur demande implicite avec la commande "p"

    \#INITIALISATION# { Quand on rencontre le motif on applique les commandes qui suivent comprises entres les accolades

    h On place le motif dans la mémoire secondaire

    :A On place une étiquette (pour branchement ultérieur)

    N On ajoute la ligne suivante dans la mémoire principale (buffer)

    \#\n/// INITIALISATION#! { Si la ligne du buffer ne se termine pas ( ! représente la négation) par le motif on applique les commandes entre accolades

    $ b B Si la dernière ligne est atteinte, on se branche à l'étiquette B

    b A On se branche à l'étiquette A et on recommence

    } Fin 2ème accolade

    s#\(.*\)\n.*#\1# Si le motif (INITIALISATION) a été trouvé en fin de ligne, on le supprime

    \#jolie#{ Si le motif "jolie" est trouvé on applique les commandes entre accolades

    p On imprime le buffer sur la sortie standard

    } Fin accolade

    g On écrase le buffer par le contenu de la mémoire secondaire

    } Fin 1ère accolade

    b A On se branche à l'étiquette A et on recommence

    :B Étiquette B (dernière ligne atteinte)

    \#jolie#{ Si le motif "jolie" est trouvé on applique les commandes entre accolades

    p On imprime le buffer sur la sortie standard

    } Fin accolade

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

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

    N'est-ce pas un peu compliqué ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    $ sed -n '/INITIALISATION/{x;/jolie/p};/INITIALISATION/!H;${G;/jolie/p}' plop
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    Un casque noir
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Mais il y avait aussi des solutions exotiques:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ tac plop | sed -n ':z;N;/INITIALISATION/!b z;/jolie/p' | tac
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Et une version awk:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    $ awk '/INITIALISATION/{ind++;a[ind]=$0;next;} /jolie/{trouve[ind]=1;} {a[ind]=a[ind]"\n"$0;} END{for (i=1;i<=length(a);i++) if (trouve[i]) print a[i];}' plop
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir

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

Discussions similaires

  1. [Bloqué]Macro autoexec casse tete
    Par torNAdE dans le forum Access
    Réponses: 24
    Dernier message: 12/07/2006, 15h09
  2. Tube nommé: un casse tête
    Par yashiro dans le forum Linux
    Réponses: 2
    Dernier message: 28/06/2006, 09h11
  3. Requete Casse tete... Help..
    Par Jerome218 dans le forum Requêtes
    Réponses: 2
    Dernier message: 24/01/2006, 05h57
  4. casse tete de requete
    Par moutey dans le forum Langage SQL
    Réponses: 2
    Dernier message: 14/12/2004, 14h00
  5. [casse-tete (pour moi)] recuperer la largeur d'un <div>
    Par Invité dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 05/11/2004, 07h39

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