AWK : extraire le contenu de paragraphes multiples

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 :

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

  1. 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
    $
    2
    1. Contributeur
      Salut,

      C'est à cette heure-ci que tu arrives feignasse ? ;-))

      Merci pour lui.
      0
    2. AIX ...j'ai dû consulter les grimoires...
      je suppose que sed AIX ne supporte pas toutes tes options ...
      0
    3. Contributeur
      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                                     
      N
      $ !b z
      s/.*Start Display Current[^\n]*\n\(.*\)\n.*/\1/
      A appeler avec cette syntaxe :
      sed -f script.sed fichier_à_traiter
      .
      0
  2. Contributeur
    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

    ;-))
    1
    1. 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.
      0
      1. 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 ;) !!!!
        0