Script shell extraction de texte precis

Résolu
Bonjour,
Je souhaite, a l'aide d'un script shell, extraire une partie d'un fichier txt. Cette partie est comprise entre deux motifs identiques et doit contenir une variable précise.

exemple fichier d'entrée:

motif
motif
motif
motif
motif
blablablablablablablablablabla
blablablablablablablablablabla
variable1
blablablablablablablablablabla
blablablablablablablablablabla
motif
motif
motif
blablablablablablablablablabla
blablablablablablablablablabla
variable2
blablablablablablablablablabla
blablablablablablablablablabla
motif
motif
motif
motif
motif
motif

je souhaite extraire la partie du texte entre deux "motif" contenant "variable1", soit le fichier en sortie:

blablablablablablablablablabla
blablablablablablablablablabla
variable1
blablablablablablablablablabla
blablablablablablablablablabla

je galère avec des substractions sed que je maitrise pas bien, pouvez vous m'aider a résoudre ma problématique?
merci par avance
Configuration: Windows XP
Firefox 2.0.0.14

5 réponses

  1. en entrée:

    [...]
    11:23:18,969 | DEBUG | pool-component.servicemix-file/ORGAN
    11:23:18,970 | DEBUG | pool-component.servicemix-file/OPX2
    11:23:18,971 | DEBUG | pool-component.servicemix-file/ORGAN2
    11:23:18,972 | DEBUG | pool-component.servicemix-file/OPX23
    [...]
    <user_description>
    <departmentNumber>DGA/DQP/CTSI/SDCIS/Site-SQ</departmentNumber>
    <departmentNumberOpe>DGA/DQP/SQ/AG/EI:100</departmentNumberOpe>
    <description>Technicien support informatique:40</description>
    <descriptionMetier>Informatique:100</descriptionMetier>
    <descriptionPole/>
    <descriptionPoste>Technicien d'exploitation et soutien informatique</descriptionPoste>
    <employeeType>Fonctionnaire</employeeType>
    <facsimileTelephoneNumber>+33 5 62 21 04 36</facsimileTelephoneNumber>
    <givenName>Josian Guy</givenName>
    [...]
    11:24:19,949 | DEBUG | pool-component.servicemix-file/ORGAN
    11:24:19,950 | DEBUG | pool-component.servicemix-file/OPX2
    11:24:19,951 | DEBUG | pool-component.servicemix-file/ORGAN2
    11:24:19,952 | DEBUG | pool-component.servicemix-file/OPX23
    [...]
    <user_description>
    <departmentNumber>DGA/DQP/CTSI/SDCIS/Site-SQ</departmentNumber>
    <departmentNumberOpe>DGA/DQP/SQ/AG/EI:100</departmentNumberOpe>
    <description>Technicien support informatique:40</description>
    <descriptionMetier>Informatique:100</descriptionMetier>
    <descriptionPole/>
    <descriptionPoste>Technicien d'exploitation et soutien informatique</descriptionPoste>
    <employeeType>Libéral</employeeType>
    <facsimileTelephoneNumber>+33 5 62 21 04 36</facsimileTelephoneNumber>
    <givenName>Josian Guy</givenName>
    [...]
    11:24:19,949 | DEBUG | pool-component.servicemix-file/ORGAN
    11:24:19,950 | DEBUG | pool-component.servicemix-file/OPX2
    11:24:19,951 | DEBUG | pool-component.servicemix-file/ORGAN2
    11:24:19,952 | DEBUG | pool-component.servicemix-file/OPX23
    [...]

    si je rentre en paramètre "fonctionnaire" je voudrais en fichier sortie:

    [...]
    <user_description>
    <departmentNumber>DGA/DQP/CTSI/SDCIS/Site-SQ</departmentNumber>
    <departmentNumberOpe>DGA/DQP/SQ/AG/EI:100</departmentNumberOpe>
    <description>Technicien support informatique:40</description>
    <descriptionMetier>Informatique:100</descriptionMetier>
    <descriptionPole/>
    <descriptionPoste>Technicien d'exploitation et soutien informatique</descriptionPoste>
    <employeeType>Fonctionnaire</employeeType>
    <facsimileTelephoneNumber>+33 5 62 21 04 36</facsimileTelephoneNumber>
    <givenName>Josian Guy</givenName>
    [...]

    et si je rentre ne parametre "libéral" je voudrais en fichier sortie:

    [...]
    <user_description>
    <departmentNumber>DGA/DQP/CTSI/SDCIS/Site-SQ</departmentNumber>
    <departmentNumberOpe>DGA/DQP/SQ/AG/EI:100</departmentNumberOpe>
    <description>Technicien support informatique:40</description>
    <descriptionMetier>Informatique:100</descriptionMetier>
    <descriptionPole/>
    <descriptionPoste>Technicien d'exploitation et soutien informatique</descriptionPoste>
    <employeeType>Libéral</employeeType>
    <facsimileTelephoneNumber>+33 5 62 21 04 36</facsimileTelephoneNumber>
    <givenName>Josian Guy</givenName>
    [...]

    Le but ultime étant de rendre plus lisible et compréhensible un fichier de LOG très lourd en filtrant les passage interessant pour l'utilisateur.
    1. Modérateur
      Salut,

      Les motifs sont identiques ou différents à chaque fois ?
      1. Les motifs contiennent une même chaine de caractères uniques, les voici:

        11:23:18,969 | DEBUG | pool-component.servicemix-file/ORGAN
        11:23:18,970 | DEBUG | pool-component.servicemix-file/OPX2
        11:23:18,971 | DEBUG | pool-component.servicemix-file/ORGAN2
        11:23:18,972 | DEBUG | pool-component.servicemix-file/OPX23
      2. Modérateur
        @Lalex'Euh... tu peux me mettre la totalité de ce que tu veux, motif + variables s'il te plaît, avec un exemple précis, c'est plus facile et ça permet de gagner en clarté et en temps ;-))
    2. Modérateur
      Si les logs sont toujours les mêmes, alors un simple "egrep" suffit :
      egrep -B7 -A2 "(Fonctionnaire|Libéral)"  fichier.log
      ;-))
      1. Merci pour ta proposition:

        egrep -B7 -A2 "(Fonctionnaire|Libéral)"

        que signifie les B7 et A2?

        par contre les [...] que j'ai ajouté dans le fichier d'entrée signifie que le nombre de "motif" successifs et le nombre de lignes a extraire sont variables (simplement pour réduire la log énorme).

        Les logs ne sont donc identiques:

        Serait-il possible de détecter les partie de logs entre deux motif successifs qui contiennent les chaines voulues "(Fonctionnaire|Libéral)"?

        J'espère vraiment me faire comprendre, désolé si c'est pas très clair...

        Merci.
    3. Modérateur
      que signifie les B7 et A2?
      B = Before donc les 7 lignes précédent le motif
      A = After, les 2 lignes suivant le motif

      Sinon, essaye ça :
       sed -n '/OPX23/{:z;N;/ORGAN/!bz;{/Fonctionnaire\|Libéral/{s/.[^\n]*\n\(.*\)\n.*/\1/p}}}' fichier
      ;-))
      1. MERCI

        ca marche du tonnerre ton expression!!

        par contre, les "motifs" sont récursifs et ils bouclent tant qu'il ne se passe rien et par conséquent, le dernier motif qui apparait avant le texte a extraire n'est pas toujours le meme...

        sed -n '/OPX23/{:z;N;/ORGAN/!bz;{/Fonctionnaire\|Libéral/{s/.[^\n]*\n\(.*\)\n.*/\1/p}}}' fichier.log

        11:23:18,969 | DEBUG | pool-component.servicemix-file/ORGAN
        11:23:18,970 | DEBUG | pool-component.servicemix-file/OPX2
        11:23:18,971 | DEBUG | pool-component.servicemix-file/ORGAN2
        11:23:18,972 | DEBUG | pool-component.servicemix-file/OPX23
        11:23:18,969 | DEBUG | pool-component.servicemix-file/ORGAN
        11:23:18,970 | DEBUG | pool-component.servicemix-file/OPX2
        11:23:18,971 | DEBUG | pool-component.servicemix-file/ORGAN2
        11:23:18,972 | DEBUG | pool-component.servicemix-file/OPX23
        11:23:18,969 | DEBUG | pool-component.servicemix-file/ORGAN
        11:23:18,970 | DEBUG | pool-component.servicemix-file/OPX2
        11:23:18,971 | DEBUG | pool-component.servicemix-file/ORGAN2
        [...]
        C'est pour cela que je voulais chercher les "DEBUG | pool-component.servicemix-file" qui, eux sont toujours présnets
      2. Modérateur
        @Lalex'Le problème justement c'est le fait qu'ils soient récurrents tes motifs et encore pire avec "DEBUG | pool-component.servicemix-file", impossible de cibler un endroit précis :-((
      3. @jipicyy-a t-il un moyen de tester tous les intervalles de texte entre les motifs récursifs et si ils contiennent la variable on les affiche sinon non?
    4. Modérateur
      Essaye ça :
      sed -n '/DEBUG/!{:z;N;/DEBUG/! bz; /Libéral\|Fonctionnaire/{s/\(.*\)\n.*/\1/p}}'
      ;-))
      1. ça marche super!!!!

        Merci beaucoup jipicy (trop fort!!!)...

        A++