AWK : extraire le contenu de paragraphes multiples
Blanc57
Messages postés
377
Statut
Membre
-
Blanc57 Messages postés 377 Statut Membre -
Blanc57 Messages postés 377 Statut Membre -
Bonjour,
Difficile de trouve un titre qui explique clairement mon problème :
J'ai un fichier log SystemOut.log de serveur WebSphere dont je souhaite extraire les informations pour chaque démarrage d'application.
Dans mon cas je considère que le démarrage est séparé par les lignes suivantes :
******************* Start Display Current Environment ********************
[...]
[...] Server XXXXXX open for e-business
J'ai commencé par utiliser une commande du genre :
Lorsqu'il n'y a qu'un démarrage dans les logs, cela fonctionne.
Le problème se pose lorsque le log SystemOut contient plusieurs traces de démarrage.
Dans ce cas, j'obtiens également toute la partie de texte entre les deux démarrages...
Comment puis-je faire pour n'extraire que la partie de texte correspondant aux démarrages, voir uniquement du dernier démarrage, même s'il y a plusieurs démarrages dans mes logs ?
J'aimerais si possible le faire par awk et de la manière la plus simple possible...
Je suis sous AIX avec KornShell
Merci d'avance pour votre aide.
Difficile de trouve un titre qui explique clairement mon problème :
J'ai un fichier log SystemOut.log de serveur WebSphere dont je souhaite extraire les informations pour chaque démarrage d'application.
Dans mon cas je considère que le démarrage est séparé par les lignes suivantes :
******************* Start Display Current Environment ********************
[...]
[...] Server XXXXXX open for e-business
J'ai commencé par utiliser une commande du genre :
cat SystemOut.log | awk '/Start\ Display\ Current\ Environment/,/open\ for\ e-business/'
Lorsqu'il n'y a qu'un démarrage dans les logs, cela fonctionne.
Le problème se pose lorsque le log SystemOut contient plusieurs traces de démarrage.
Dans ce cas, j'obtiens également toute la partie de texte entre les deux démarrages...
Comment puis-je faire pour n'extraire que la partie de texte correspondant aux démarrages, voir uniquement du dernier démarrage, même s'il y a plusieurs démarrages dans mes logs ?
J'aimerais si possible le faire par awk et de la manière la plus simple possible...
Je suis sous AIX avec KornShell
Merci d'avance pour votre aide.
4 réponses
-
hello
avec awk, en reprenant le fchier plop de zip30+1$ awk '{t[NR]=$0} /Start Display/ {f=NR} /open for e-business/ {l=NR} END {for(n=f+1; n<l;)print t[n++]}' plop
blabla4
blabla4
$-
-
-
Peut-être pas sous cette forme (syntaxe sur une ligne), mais d'après le grimoire sed de AIX, toutes les options y figurent. Sûrement que dans un fichier ça devrait passer sous cette forme :
:z
A appeler avec cette syntaxe :
N
$ !b z
s/.*Start Display Current[^\n]*\n\(.*\)\n.*/\1/sed -f script.sed fichier_à_traiter
.
-
-
Salut,
J'aimerais si possible le faire par awk
Il y a une raison particulière ?
Sinon, avec sed on peut faire ceci (en espérant que ta version sur AIX en accepte la syntaxe) :
Le fichier exemple (avec plusieurs paragraphes) :$ cat plop
******************* Start Display Current Environment ********************
blabla1
blabla1
[...] Server XXXXXX open for e-business
******************* Start Display Current Environment ********************
blabla2
blabla2
[...] Server XXXXXX open for e-business
******************* Start Display Current Environment ********************
blabla3
blabla3
[...] Server XXXXXX open for e-business
******************* Start Display Current Environment ********************
blabla4
blabla4
[...] Server XXXXXX open for e-business
Extraction de tous les paragraphes :$ sed -n '/Start Display Current/,/open for e-business/{//b;p}' plop
blabla1
blabla1
blabla2
blabla2
blabla3
blabla3
blabla4
blabla4
Extraction uniquement du dernier paragraphe :$ sed ':z;N;$!bz;s/.*Start Display Current[^\n]*\n\(.*\)\n.*/\1/;' plop
blabla4
blabla4
;-)) -
Merci beaucoup pour votre aide et vos réponses...
Je n'ai pas l'occasion de tester vos propositions aujourd'hui. Je pourrais tester cela demain ou après-demain je pense...
Quant à "pourquoi awk", c'est vrai qu'avec le recul je n'ai aucune obligation d'utiliser awk. Du moment que mon script fonctionne.
C'est juste que j'avais commencé avec awk. Je savais bien qu'il devait y avoir une solution grâce à awk et en même temps, j'étais curieux de connaitre cette solution.
Merci encore. -
J'ai pu faire le test sous Bourne Shell et effectivement cela fonctionne.
Je n'ai pas pu réaliser le test sous AIX/KornShell pour l'instant mais il n'y a pas de raisons que cela ne marche pas...
Merci encore énormement pour votre aide à tous les deux ;) !!!!