Rechercher : dans
Par :

Script shell extraction de texte precis

Dernière réponse le 13 jun 2008 à 16:37:22 Lalex', le 13 jun 2008 à 11:58:36 
 Signaler ce message aux modérateurs

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

Meilleures réponses pour « script shell extraction de texte precis » dans :
Exécuter un script shell VoirExécution d'un script Pour pouvoir exécuter un script ou un programme en ligne de commande il y a plusieurs possibilités : 1. Le chemin absolu 2. Le chemin relatif 3. Modifier la variable PATH Note: Le Sha-Bang Premièrement,...

1

jipicy, le 13 jun 2008 à 12:02:11

Salut,

Les motifs sont identiques ou différents à chaque fois ?
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

2

Lalex', le 13 jun 2008 à 12:08:06

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

Répondre à Lalex'

3

jipicy, le 13 jun 2008 à 12:14:10

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 ;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

4

Lalex', le 13 jun 2008 à 12:29:12

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.

Répondre à Lalex'

5

jipicy, le 13 jun 2008 à 13:09:16

Si les logs sont toujours les mêmes, alors un simple "egrep" suffit :

egrep -B7 -A2 "(Fonctionnaire|Libéral)"  fichier.log
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

6

Lalex', le 13 jun 2008 à 13:28:15

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.

Répondre à Lalex'

7

jipicy, le 13 jun 2008 à 13:47:22

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
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

8

Lalex', le 13 jun 2008 à 14:29:32

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

Répondre à Lalex'

9

jipicy, le 13 jun 2008 à 14:38:02

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 :-((
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

10

Lalex', le 13 jun 2008 à 14:51:37

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?

Répondre à Lalex'

11

jipicy, le 13 jun 2008 à 14:56:27

Essaye ça :

sed -n '/DEBUG/!{:z;N;/DEBUG/! bz; /Libéral\|Fonctionnaire/{s/\(.*\)\n.*/\1/p}}'
;-))
JP - Éleveur de pingouins -
Faites un geste pour l'environnement, fermez vos fenêtres et adoptez un manchot.

Répondre à jipicy

12

 Lalex', le 13 jun 2008 à 16:37:22

ça marche super!!!!

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

A++

Répondre à Lalex'