Script shell extraction de texte precis

Résolu/Fermé
Lalex' - 13 juin 2008 à 11:58
 Lalex' - 13 juin 2008 à 16:37
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

5 réponses

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
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899
13 juin 2008 à 12:02
Salut,

Les motifs sont identiques ou différents à chaque fois ?
0
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
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899 > Lalex'
13 juin 2008 à 12:14
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 ;-))
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899
13 juin 2008 à 13:09
Si les logs sont toujours les mêmes, alors un simple "egrep" suffit :
egrep -B7 -A2 "(Fonctionnaire|Libéral)"  fichier.log
;-))
0
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.
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899
13 juin 2008 à 13:47
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
;-))
0
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
0
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899 > Lalex'
13 juin 2008 à 14:38
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 :-((
0
Lalex' > jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020

13 juin 2008 à 14:51
y-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?
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
jipicy
Messages postés
40805
Date d'inscription
jeudi 28 août 2003
Statut
Modérateur
Dernière intervention
10 août 2020
4 899
13 juin 2008 à 14:56
Essaye ça :
sed -n '/DEBUG/!{:z;N;/DEBUG/! bz; /Libéral\|Fonctionnaire/{s/\(.*\)\n.*/\1/p}}'
;-))
0
ça marche super!!!!

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

A++
0