IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Shell et commandes POSIX Discussion :

grep sur un pattern qui s'étend en deux lignes [Solaris]


Sujet :

Shell et commandes POSIX

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Par défaut grep sur un pattern qui s'étend en deux lignes
    Bonjour,

    Je voudrais faire un grep comme l'exemple ci-dessous:

    fichier:
    blabla bla blaba PAT
    TERN bla blbla blabla
    blabla PATTERN
    me retourne:
    blabla PATTERN bla
    je voudrais que ça me retourne aussi la 2ème occurence de PATTERN qui est coupée en deux ligne mais en une seule ligne

    blabla bla blaba PATTERN bla blbla blabla
    le résultat final serait:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $ grep PATTERN fichier
    blabla PATTERN bla
    blabla bla blaba PATTERN bla blbla blabla

    Prière de m'orienter vers une option de grep qui résoud ce problème ou une autre commande ou script.

    PS:unix sun solaris

    Merci d'avance.

  2. #2
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Essaie ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    nawk '
    {
    	j=oldline $0;
    	if(j ~ /PATTERN/) print j
    	oldline=$0;
    }
    ' fichier

  3. #3
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Salut,

    Une petite bidouille avec "sed"...

    Le fichier de départ, j'ai volontairement numéroter les lignes contenant le "PATTERN" et rajouter quelques cas supplémentaires :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ cat brol
    blabla
    1 blabla bla blaba PAT
    TERN bla blbla blabla
    2 blabla PATTERN
    blabla
    3 blabla bla blaba PATTER
    N bla blbla blabla
    4 bla PATTERN blablabla
    5 blabla bla blaba P
    ATTERN bla blbla blabla
    blablabla
    Le script "sed" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ cat script.sed 
    #n
    /PATTERN/ {
        P
        D
    }
    N
    /P\n*A\n*T\n*T\n*E\n*R\n*N/ {
        s/\n//
        P
        D
    }
    D
    L'exécution et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed -f script.sed brol
    1 blabla bla blaba PATTERN bla blbla blabla
    2 blabla PATTERN
    3 blabla bla blaba PATTERN bla blbla blabla
    4 bla PATTERN blablabla
    5 blabla bla blaba PATTERN bla blbla blabla
    Par contre avec "awk" il y a un soucis, il ne vide pas le buffer une fois le "PATTERN" rencontré, ce qui pose soucis :
    Le script de jlliagre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat script.awk 
    {
    	j=oldline $0;
    	if(j ~ /PATTERN/) print j
    	oldline=$0;
    }
    L'exécution et le résultat ::
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ nawk -f script.awk brol 
    1 blabla bla blaba PATTERN bla blbla blabla
    TERN bla blbla blabla2 blabla PATTERN
    2 blabla PATTERNblabla
    3 blabla bla blaba PATTERN bla blbla blabla
    N bla blbla blabla4 bla PATTERN blablabla
    4 bla PATTERN blablabla5 blabla bla blaba P
    5 blabla bla blaba PATTERN bla blbla blabla
    Même avec l'exemple donné par l'auteur du topic :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat ../plop 
    blabla bla blaba PAT
    TERN bla blbla blabla
    blabla PATTERN
     
    $ nawk -f script.awk ../plop 
    blabla bla blaba PATTERN bla blbla blabla
    TERN bla blbla blablablabla PATTERN

  4. #4
    Membre averti
    Inscrit en
    Janvier 2012
    Messages
    16
    Détails du profil
    Informations forums :
    Inscription : Janvier 2012
    Messages : 16
    Par défaut
    Bonjour jlliagre, zipe31,

    Merci pour votre aide. J'ai testé les deux solutions. zipe31 a bien raison. Il y a un petit souci avec nawk. le sed est nickel.

    @zipe31: pourriez-vous m'expliquer un peu votre solution et le souci du buffer.

  5. #5
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    1 946
    Détails du profil
    Informations personnelles :
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations forums :
    Inscription : Janvier 2011
    Messages : 1 946
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    #n
    Affichage uniquement sur demande (avec option "-p")
    
    /PATTERN/ {
    Si le motif est rencontré appliquer les commandezs entre accolades
    
        P
        On envoie tout le contenu du buffer jusqu'au 1er caractère de fin de ligne (\n) sur la sortie standard
        
        D
        On supprime tout le contenu du buffer jusqu'au 1er caractère de fin de ligne (\n) et on redémarre en haut
        du script sans charger une nouvelle ligne.
    
    }
    Fin des commandes s'appliquant au motif
    
    N
    On charge dans le buffer la ligne suivante
    
    /P\n*A\n*T\n*T\n*E\n*R\n*N/ {
    Si le motif (chaque caractère du motif étant suivi ou pas par un caractère de fin de ligne
    (\n), appliquer les commandezs entre accolades
    
        s/\n//
        On supprime le saut de ligne
        
        P
        On envoie tout le contenu du buffer jusqu'au 1er caractère de fin de ligne (\n) sur la sortie standard
        
        D
        On supprime tout le contenu du buffer jusqu'au 1er caractère de fin de ligne (\n) et on redémarre en 
        haut du script sans charger une nouvelle ligne.
        
    }
    Fin des commandes s'appliquant au motif
    
    D
    On supprime tout le contenu du buffer jusqu'au 1er caractère de fin de ligne (\n) et on redémarre en 
    haut du script sans charger une nouvelle ligne.

  6. #6
    Modérateur
    Avatar de jlliagre
    Homme Profil pro
    Ingénieur support avancé & développement
    Inscrit en
    Juin 2007
    Messages
    2 695
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur support avancé & développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 2 695
    Par défaut
    Le "non vidage du buffer" dans la solution que j'ai proposé est volontaire, c'est pour traiter les occurences multiples éventuelles.

    ex:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    $ cat z
    un PAT
    TERN deux PAT
    TERN trois
    quatre
    $ nawk '
    {
      j=oldline $0;
      if(j ~ /PATTERN/) print j
      oldline=$0;
    }
    ' z
    un PATTERN deux PAT
    TERN deux PATTERN trois
    $ sed -f s.sed z                                         
    un PATTERN deux PAT
    La solution avec sed loupe le deuxième PATTERN.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [CR XI] Affiché 0 sur une commande qui ne renvoi pas de ligne
    Par Rits dans le forum Débuter
    Réponses: 1
    Dernier message: 01/03/2010, 14h49
  2. Réponses: 14
    Dernier message: 14/03/2005, 09h16
  3. probléme de cadre sur une image qui me sert de lien
    Par thomas_chamas dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 26/11/2004, 17h36
  4. Travailler sur des données qui doivent être triées
    Par haypo dans le forum XML/XSL et SOAP
    Réponses: 2
    Dernier message: 19/07/2003, 17h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo