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

Linux Discussion :

grep, sed, awk pour extraire un contenu entre deux patterns


Sujet :

Linux

  1. #1
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut grep, sed, awk pour extraire un contenu entre deux patterns
    Bonjour à tous,

    J'ai un soucis assez compliqué à résoudre, en tout cas, en ce qui me concerne...

    Voici un extrait du contenu que je souhaite parser :
    config SCSI_LOGGING
    bool "SCSI logging facility"
    depends on SCSI
    ---help---
    This turns on a logging facility that can be used to debug a number
    of SCSI related problems.

    If you say Y here, no logging output will appear by default, but you
    can enable logging by saying Y to "/proc file system support" and
    "Sysctl support" below and executing the command

    echo "scsi log token [level]" > /proc/scsi/scsi

    at boot time after the /proc file system has been mounted.

    There are a number of things that can be used for 'token' (you can
    find them in the source: <file:drivers/scsi/scsi.c>), and this
    allows you to select the types of information you want, and the
    level allows you to select the level of verbosity.

    If you say N here, it may be harder to track down some types of SCSI
    problems. If you say Y here your kernel will be somewhat larger, but
    there should be no noticeable performance impact as long as you have
    logging turned off.

    config SCSI_SCAN_ASYNC
    bool "Asynchronous SCSI scanning"
    depends on SCSI
    help
    The SCSI subsystem can probe for devices while the rest of the
    system continues booting, and even probe devices on different
    Et le résultat attendu :
    SCSI_LOGGING SCSI
    SCSI_SCAN_ASYNC SCSI
    Donc, si j'explique : je veux extraire le "depends on" pour chaque "config...".
    Et tant qu'à compliquer, on peut très bien avoir :
    config A
    depends on B
    depends on !C
    Et je veux :
    A B !C
    Et là je coince, j'ai beau tourner grep, sed et awk dans tous les sens, je m'en sors pas...

    Merci d'avance de votre aide !
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  2. #2
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    salut,

    dans awk il existe une façon de récupérer un interval de ligne, je sais pas si c'est ça que tu recherches mais jettes y un coup d'oeil :

    AWK '/pattern1/, pattern2/'

    Exemple :

    [root@ALPHA ~]# cat cmd.txt
    ls Liste les fichiers d'un repertoire, affiche les attributs d'un fichier
    cp Copie de fichier
    rm Supprime un fichier
    mv Deplace ou renome un fichier
    ln cree un lien
    pwd Affiche le repertoir courant
    cd change de repertoire
    mkdir creer un repertoire

    [root@ALPHA ~]# cat cmd.txt | awk '/Copie/,/cree/'
    cp Copie de fichier
    rm Supprime un fichier
    mv Deplace ou renome un fichier
    ln cree un lien

    voila apres il suffit de récupérer et de découper les lignes qui t'intéressent.

  3. #3
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Oui, j'ai bien trouvé ce genre de trucs, mais ça n'est pas assez puissant pour moi.
    Déjà, la première étape serait d'extraire tout ce qui se trouve entre deux "config".
    Ca, je le fait avec :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/config SCSI/,/^config/p'
    Idéalement, j'aurais voulu ne récupérer que ce qui est dedans, sans les deux lignes qui match mais ce n'est pas très grave.

    Deuxième étape, je souhaite extraire, par exemple, ce qui est entre "help" et la première ligne blanche entière.
    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed -n '/help/,/[:blank:]/p'
    Mais le résultat est (sur l'exemple donné dans mon premier message) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    ---help---
    This turns on a logging facility that can be used to debug a number
    Alors que je voudrais avoir :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    ---help---
    This turns on a logging facility that can be used to debug a number
    of SCSI related problems.
    Et là, je coince...
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  4. #4
    Membre du Club
    Profil pro
    ingénieur
    Inscrit en
    Septembre 2008
    Messages
    54
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Septembre 2008
    Messages : 54
    Points : 57
    Points
    57
    Par défaut
    j'ai essayer sur ma machine et ca a l'air de fonctionner, voici le fichier test :

    [root@ALPHA ~]# cat > cmd2
    config SCSI_LOGGING
    bool "SCSI logging facility"
    depends on SCSI
    ---help---
    This turns on a logging facility that can be used to debug a number
    of SCSI related problems.

    If you say Y here, no logging output will appear by default, but you
    can enable logging by saying Y to "/proc file system support" and
    "Sysctl support" below and executing the command

    les recherches :

    [root@ALPHA ~]# cat cmd2 | sed -n '/help/,/[:blank:]/p'
    ---help---
    This turns on a logging facility that can be used to debug a number
    [root@ALPHA ~]# cat cmd2 | awk '/-/,/problems/'
    ---help---
    This turns on a logging facility that can be used to debug a number
    of SCSI related problems.

    C'est ça que tu voulais ?

  5. #5
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    Non, car sinon, ça serait simple :p.
    Ce que je souhaite, c'est être indépendant du contenu du bloc à extraire.
    Ce qui ne change pas c'est la présence (facultative) de help et la présence (obligatoire) des "config ...".
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

  6. #6
    Nouveau membre du Club
    Inscrit en
    Mars 2010
    Messages
    46
    Détails du profil
    Informations forums :
    Inscription : Mars 2010
    Messages : 46
    Points : 37
    Points
    37
    Par défaut
    Bjr,
    Pour répondre au premier post (après ca s'éparpille, je sais plus ce qui est recherché ...!)
    fichier CA-log
    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
    config SCSI_LOGGING
    bool "SCSI logging facility"
    depends on SCSI
    depends on SCSI222
    ---help---
    This turns on a logging facility that can be used to debug a number
    of SCSI related problems.
     
    If you say Y here, no logging output will appear by default, but you
    can enable logging by saying Y to "/proc file system support" and
    "Sysctl support" below and executing the command
     
    echo "scsi log token [level]" > /proc/scsi/scsi
     
    at boot time after the /proc file system has been mounted.
     
    There are a number of things that can be used for 'token' (you can
    find them in the source: <file:drivers/scsi/scsi.c>), and this
    allows you to select the types of information you want, and the
    level allows you to select the level of verbosity.
     
    If you say N here, it may be harder to track down some types of SCSI
    problems. If you say Y here your kernel will be somewhat larger, but
    there should be no noticeable performance impact as long as you have
    logging turned off.
     
    config SCSI_SCAN_ASYNC
    bool "Asynchronous SCSI scanning"
    depends on SCSI
    help
    The SCSI subsystem can probe for devices while the rest of the
    system continues booting, and even probe devices on different
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    #! /bin/bash
    while read ligne
    do
      if [[ "$ligne" =~ config|depends ]]; then
         [[ "$ligne" =~ config ]] && var="$var\n"
         var="$var ${ligne##* }"
      fi
    done < <( sed -n '/^config/,/^$/p' ./CA-log )
    sed '1d;s/^ //' <<< "$(echo -e "$var")"
    exit
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    SCSI_LOGGING SCSI SCSI222
    SCSI_SCAN_ASYNC SCSI
    C'est pas ça qu'il fallait ?
    Y a surement mieux, mais c'est plus cher

  7. #7
    Membre éclairé

    Inscrit en
    Juin 2004
    Messages
    1 397
    Détails du profil
    Informations forums :
    Inscription : Juin 2004
    Messages : 1 397
    Points : 763
    Points
    763
    Par défaut
    C'est ce qu'il fallait, et j'avais fini par y arriver avec d'autres moyens beaucoup plus complexes.
    Merci pour cela, j'enregistre .
    Aucune réponse à une question technique par MP.
    Ce qui vous pose problème peut poser problème à un(e) autre

    http://thebrutace.labrute.fr

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

Discussions similaires

  1. [RegEx] preg_match pour recuperer le contenu entre deux expressions
    Par getrude dans le forum Langage
    Réponses: 5
    Dernier message: 02/05/2012, 18h10
  2. Réponses: 11
    Dernier message: 04/02/2012, 18h24
  3. Réponses: 6
    Dernier message: 25/10/2011, 15h52
  4. Regex pour extraire un lien entre crochets
    Par elwario91 dans le forum Bibliothèque standard
    Réponses: 1
    Dernier message: 26/03/2008, 11h34
  5. extraire du contenu entre des balises
    Par freeriders88 dans le forum ASP
    Réponses: 3
    Dernier message: 30/05/2007, 10h25

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