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

  1. #1
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Points : 32
    Points
    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 éminent Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 035
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    salut,

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

  3. #3
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Points : 32
    Points
    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 éminent

    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
    Points : 6 276
    Points
    6 276
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  5. #5
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Points : 32
    Points
    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 éminent

    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
    Points : 6 276
    Points
    6 276
    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
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    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
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  8. #8
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    Bonjour

    N'est-ce pas un peu compliqué ?
    Certes, mais c'est ma spécialité, pourquoi faire simple quand on peut faire compliqué, hein ?

    Sinon, chapeau pour les solutions, notamment celle qui répond du tac au tac
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    Citation Envoyé par zipe31
    #n On n'affiche sur la sortie standard que sur demande implicite avec la commande "p"
    Citation Envoyé par man sed
    #comment
    The comment extends until the next newline (or the end of a -e script fragment).
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  10. #10
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par N_BaH Voir le message
    Bonjour,


    info sed :

    `#'
    [No addresses allowed.]

    The `#' character begins a comment; the comment continues until
    the next newline.

    If you are concerned about portability, be aware that some
    implementations of `sed' (which are not POSIX conformant) may only
    support a single one-line comment, and then only when the very
    first character of the script is a `#'.

    Warning: if the first two characters of the `sed' script are `#n',
    then the `-n' (no-autoprint) option is forced.
    If you want to put
    a comment in the first line of your script and that comment begins
    with the letter `n' and you do not want this behavior, then be
    sure to either use a capital `N', or place at least one space
    before the `n'
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    d'accord, ça ne fonctionnait pas comme tu l'as décrit :/
    il semble falloir que #n soit la première ligne du script; d'éventuelles commandes sur cette première ligne ne seraient pas exécutées.

    merci,
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  12. #12
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    d'accord, ça ne fonctionnait pas comme tu l'as décrit :/
    il semble falloir que #n soit la première ligne du script; d'éventuelles commandes sur cette première ligne ne seraient pas exécutées.

    merci,
    En fait dans ma tête c'était clair que "#n" était sur la 1ère ligne, impliquant par la suite l'emploi de "p" pour l'affichage

    Citation Envoyé par N_BaH Voir le message
    d'éventuelles commandes sur cette première ligne ne seraient pas exécutées.
    Si si, des commandes seraient interprétées, le tout c'est si tu veux mettre un commentaire, il ne faut surtout pas que la 1ère lettre suivant le dièse soit un "n" sans quoi ce serait interprété comme l'option "-n".
    Si tu veux mettre un commentaire qui commence par la lettre "n", soit la mettre en majuscule, soit mettre un espace :

    #ne pas mettre de dièse suivi d'un "n" en 1ère ligne d'un script = Pas bon
    #Ne pas mettre de dièse suivi d'un "n" en 1ère ligne d'un script = Bon
    # ne pas mettre de dièse suivi d'un "n" en 1ère ligne d'un script = Bon
    $ man woman
    Il n'y a pas de page de manuel pour woman.

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Si si, des commandes seraient interprétées
    bah, avec moi, elles veulent pas.

    si je fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  -f script.sed /etc/hosts
    ça n'affiche rien; il faut que je mette ce qui est après le point virgule à la ligne pour obtenir l'affichage des lignes demandées.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  14. #14
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    bah, avec moi, elles veulent pas.

    si je fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed  -f script.sed /etc/hosts
    ça n'affiche rien; il faut que je mette ce qui est après le point virgule à la ligne pour obtenir l'affichage des lignes demandées.
    j'avions mal compris, je croyais que tu parlais de commandes mises directement sur la 1ère ligne mais sans le "#n"

    Puis de tout façon, avec mes explications précédentes, ton test de 1ère ligne rentre bien dans la condition du "il ne faut surtout pas que la 1ère lettre suivant le dièse soit un "n" sans quoi ce serait interprété comme l'option "-n"." et j'ai oublié de préciser que tout ce qui suit n'est pas interprété et à partir du moment où la ligne débute par un dièse c'est du domaine du commentaire dans tout autre cas
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  15. #15
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Merci Flodelarab pour ces solutions sed et awk!

    Décidément, je ne parle pas sed fluentement et, à mon âge, je crois que c'est un peu trop tard!

    La solution awk a donc ma préférence pour sa lisibilité (pas besoin d'apprendre un autre langage!) et son extensibilité.

    Une petite remarque: elle met tout le fichier en mémoire et imprime seulement à la fin, ce qui, dans certains cas, peut être au minimum bon à savoir.

    Je crois qu'on peut limiter cet impact en stockant seulement le bloc courant et en l'affichant au fur et à mesure:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk '/INITIALISATION/{if (trouve) print a ;trouve=0;a=$0;next;} /jolie/{trouve=1;} {a=a"\n"$0;} END{if (trouve) print a;}' plop
    De cette manière, on ne garde en mémoire que le bloc courant.

    PS: j'étais parti d'une toute petite modification de ton script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ awk '/INITIALISATION/{if (trouve[ind]) {print a[ind]; a[ind]="";};ind++;a[ind]=$0;next;} /jolie/{trouve[ind]=1;} {a[ind]=a[ind]"\n"$0;} END{if (trouve[ind]) print a[ind];}' plop

  16. #16
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Vraiment, merci à tous pour vos réponses
    Je vais pouvoir étudier tout ça ^^

    J'aime particulierement la solution exotique de Flodelarab.
    Je ne connaissais pas du tout la commande tac et je trouve ça ingénieux comme solution

  17. #17
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 101
    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 101
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Les explications plutôt que prévu ;-))
    Merci pour les explications!

    mais je crois que j'ai un peu de mal à digérer le sed...

    PS (et HS): si tu avais répondu moins vite, aurais-tu dit "Les explications plutard que prévu" (voire "Les explications Plutarque prévu" )?
    Ou alors, voulais-tu vraiment dire: "Les explications à la place de prévu"?

  18. #18
    Nouveau membre du Club
    Inscrit en
    Octobre 2009
    Messages
    32
    Détails du profil
    Informations forums :
    Inscription : Octobre 2009
    Messages : 32
    Points : 32
    Points
    32
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    PS (et HS): si tu avais répondu moins vite, aurais-tu dit "Les explications plutard que prévu" (voire "Les explications Plutarque prévu" )?
    Ou alors, voulais-tu vraiment dire: "Les explications à la place de prévu"?
    Nan il a juste fait une légère faute, rien de grave ^^ C'etait dans le sens de "plus tôt que prévu", puisqu'il m'a répondu dans la soirée

  19. #19
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Décidément, je ne parle pas sed fluentement et, à mon âge, je crois que c'est un peu trop tard!
    Manifestement, moi non plus. En relisant, j'ai vu une erreur. La bonne commande n'est pas avec un grand G mais un petit g.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    sed -n '/INITIALISATION/{x;/jolie/p};/INITIALISATION/!H;${g;/jolie/p}' /tmp/plop
    /// INITIALISATION ///
    Un jolie pommier
    Un jolie poirier
    De l herbe
    Une branche
    /// INITIALISATION ///
    Une jolie poupée en ceramique
    Un casque noir
    Si vous regardez bien, la dernière ligne "casque noir" s'était invité dans le bloc d'avant.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

  20. #20
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par Flodelarab Voir le message
    La bonne commande n'est pas avec un grand G mais un petit g.
    Je traduis…

    La bonne commande n'est pas avec un grand G (ajout de la mémoire secondaire au contenu de la mémoire principale) mais un petit g (écrasement de la mémoire principale par le contenu de la mémoire secondaire).

    $ man woman
    Il n'y a pas de page de manuel pour woman.

+ Répondre à la discussion
Cette discussion est résolue.
Page 1 sur 2 12 DernièreDernière

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