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 GNU Discussion :

Extraire du texte


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut Extraire du texte
    Bonjour,

    J'ai vu quelques topics parlant de ce même sujet mais je n'ai pas réussi à solutionner mon problème.

    Je voudrais extraire un "bloc" de texte commençant par un mot bien définit et se terminant systématiquement par une ligne vide.

    Dans mon fichier il y a de nombreux paragraphes suivant cette forme :

    Ceci est le debut de la premiere ligne
    Toutes les
    suivantes sont indentées
    comme ceci
    et se termine par une ligne vide comme ci dessous


    Ceci est le debut de la premiere ligne du second paragraphe
    Toutes les
    suivantes sont indentées
    comme ceci
    et se termine par une ligne vide comme ci dessous
    Il faudrait donc que j'arrive à faire un petit script qui permet de récupérer le texte se trouvant entre "le premier mot" et "la ligne vide" mais je ne sais pas comment faire, en grep ce n'est pas possible.
    Après j'ai vu des sed mais là mon niveau n'est pas assez, je cherche mais ça coince un peu la haut

    Merci de votre aide
    Tart'

  2. #2
    Expert confirmé
    Avatar de becket
    Profil pro
    Informaticien multitâches
    Inscrit en
    Février 2005
    Messages
    2 854
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations professionnelles :
    Activité : Informaticien multitâches
    Secteur : Service public

    Informations forums :
    Inscription : Février 2005
    Messages : 2 854
    Par défaut
    Quelque chose de rapide avec awk devrait te donner une direction

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     awk  '{RS="Ceci" ; print   }'

  3. #3
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Bonjour,
    Merci de ta réponse.

    Effectivement Awk peut être utile.

    Je vais directement donner un morceau de mon fichier ce sera plus simple :

    En realité il s'agit d'un fichier de configuration Cisco que je dois "parser".
    Mon fichier va ressembler à ceci quand je le recupère :

    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
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    Ethernet107/1/20 is down (Link not connected)
      Hardware: 100/1000 Ethernet, address: a4138.7589.1955 (bia a4138.7589.1955)
      Description: -- Libre --
      MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
         reliability 255/255, txload 1/255, rxload 1/255
      Encapsulation ARPA
      Port mode is access
      auto-duplex, auto-speed
      Beacon is turned off
      Input flow-control is off, output flow-control is on
      Switchport monitor is off
      EtherType is 0x8100
      Last link flapped never
      Last clearing of "show interface" counters never
      30 seconds input rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      30 seconds output rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      Load-Interval #2: 5 minute (300 seconds)
        input rate 0 bps, 0 pps; output rate 0 bps, 0 pps
      RX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 input packets  0 bytes
        0 jumbo packets  0 storm suppression bytes
        0 giants  0 input error  0 short frame  0 overrun   0 underrun
        0 watchdog  0 if down drop
        0 input with dribble  0 input discard
        0 Rx pause
      TX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 output packets  0 bytes
        0 jumbo packets
        0 output errors  0 collision  0 deferred  0 late collision
        0 lost carrier  0 no carrier  0 babble
        0 Tx pause
      0 interface resets
     
    Ethernet107/1/21 is down (Link not connected)
      Hardware: 100/1000 Ethernet, address: a418.7589.1956 (bia a418.7589.1956)
      Description: -- Libre --
      MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
         reliability 255/255, txload 1/255, rxload 1/255
      Encapsulation ARPA
      Port mode is access
      auto-duplex, auto-speed
      Beacon is turned off
      Input flow-control is off, output flow-control is on
      Switchport monitor is off
      EtherType is 0x8100
      Last link flapped never
      Last clearing of "show interface" counters never
      30 seconds input rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      30 seconds output rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      Load-Interval #2: 5 minute (300 seconds)
        input rate 0 bps, 0 pps; output rate 0 bps, 0 pps
      RX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 input packets  0 bytes
        0 jumbo packets  0 storm suppression bytes
        0 giants  0 input error  0 short frame  0 overrun   0 underrun
        0 watchdog  0 if down drop
        0 input with dribble  0 input discard
        0 Rx pause
      TX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 output packets  0 bytes
        0 jumbo packets
        0 output errors  0 collision  0 deferred  0 late collision
        0 lost carrier  0 no carrier  0 babble
        0 Tx pause
      0 interface resets
     
    Ethernet107/1/22 is down (Link not connected)
      Hardware: 100/1000 Ethernet, address: a4138.7589.1957 (bia a4138.7589.1957)
      Description: -- Libre --
      MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
         reliability 255/255, txload 1/255, rxload 1/255
      Encapsulation ARPA
      Port mode is access
      auto-duplex, auto-speed
      Beacon is turned off
      Input flow-control is off, output flow-control is on
      Switchport monitor is off
      EtherType is 0x8100
      Last link flapped never
      Last clearing of "show interface" counters never
      30 seconds input rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      30 seconds output rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      Load-Interval #2: 5 minute (300 seconds)
        input rate 0 bps, 0 pps; output rate 0 bps, 0 pps
      RX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 input packets  0 bytes
        0 jumbo packets  0 storm suppression bytes
        0 giants  0 input error  0 short frame  0 overrun   0 underrun
        0 watchdog  0 if down drop
        0 input with dribble  0 input discard
        0 Rx pause
      TX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 output packets  0 bytes
        0 jumbo packets
        0 output errors  0 collision  0 deferred  0 late collision
        0 lost carrier  0 no carrier  0 babble
        0 Tx pause
      0 interface resets
    Pour l'exemple je n'ai pris que 3 interfaces


    Il faudrait que le scipt récupère en fonction de la demande les informations suivantes :
    Si l'utilisateur veut voir l'interface Ethernet107/1/22 le script ne doit retourner que ceci :
    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
    Ethernet107/1/22 is down (Link not connected)
      Hardware: 100/1000 Ethernet, address: a4138.7589.1957 (bia a4138.7589.1957)
      Description: -- Libre --
      MTU 1500 bytes, BW 1000000 Kbit, DLY 10 usec,
         reliability 255/255, txload 1/255, rxload 1/255
      Encapsulation ARPA
      Port mode is access
      auto-duplex, auto-speed
      Beacon is turned off
      Input flow-control is off, output flow-control is on
      Switchport monitor is off
      EtherType is 0x8100
      Last link flapped never
      Last clearing of "show interface" counters never
      30 seconds input rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      30 seconds output rate 0 bits/sec, 0 bytes/sec, 0 packets/sec
      Load-Interval #2: 5 minute (300 seconds)
        input rate 0 bps, 0 pps; output rate 0 bps, 0 pps
      RX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 input packets  0 bytes
        0 jumbo packets  0 storm suppression bytes
        0 giants  0 input error  0 short frame  0 overrun   0 underrun
        0 watchdog  0 if down drop
        0 input with dribble  0 input discard
        0 Rx pause
      TX
        0 unicast packets  0 multicast packets  0 broadcast packets
        0 output packets  0 bytes
        0 jumbo packets
        0 output errors  0 collision  0 deferred  0 late collision
        0 lost carrier  0 no carrier  0 babble
        0 Tx pause
      0 interface resets
    et non pas mes 5000 pages de conf

    Voici donc pour l'indentation, le début de paragraphe qui est généralement Ethernet machin ou port channel machin.

    et la séparation entre ces paragraphes est une ligne vide.

    J'ai vu dans d'autres topics des choses de ce genre :

    $ sed '/ik987/,/[\.\?\!]/ !d; s/\([\.\?\!]\).*/\1/' t
    De ce topic :
    http://www.developpez.net/forums/d12...xtraire-texte/

    J'ai donc bien compris cette première partie : sed '/ik987/,/[\.\?\!]/ qui sert de "délimiteur"

    Donc dans mon cas ça donnerait :
    sed '/Ethernet107/7/22/,/^$/

    Bon déjà je crois avoir deux problèmes, il y des / dans mon mot de recherche et caractère spécial pour la fin

    Mais la seconde partie de la commande je ne la comprend pas :/ : !d; s/\([\.\?\!]\).*/\1/' t

    Merci à vous.

  4. #4
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 658
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 658
    Par défaut
    Bonjour,

    il faut changer le séparateur d'expression / par un autre, qui n'apparaît pas dans l'expression recherchée.

    la commande s est utilisée pour substituer; elle n'est pas utile ici.

    Attention, la ligne de "fin" n'est pas vide, elle contient un espace :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed '\@^Ethernet107/1/20@,/^ $/!d' nomFichier
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  5. #5
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Côtes d'Armor (Bretagne)

    Informations professionnelles :
    Activité : Développeur informatique en retraite

    Informations forums :
    Inscription : Avril 2008
    Messages : 2 102
    Par défaut
    Citation Envoyé par tartarus Voir le message
    Donc dans mon cas ça donnerait :
    sed '/Ethernet107/7/22/,/^$/

    Bon déjà je crois avoir deux problèmes, il y des / dans mon mot de recherche et caractère spécial pour la fin
    Ben, il me semble que ça suffit!
    Il suffit de quoter les caractères spéciaux (ou utiliser un autre caractères comme N_BaH):

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    criteria='Ethernet107/1/22'
    criteria_re=$(echo "${criteria}" | sed -e 's|/|\\/|g')
    sed -n "/${criteria_re}/,/^ *\$/p" le_fichier
    Ps: les lignes vides ne sont pas vides (elles contiennent une espace (il me semble))

  6. #6
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    la même en awk en déportant le problème du / sur l'option -v, ^$ match une ligne vide :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    awk -v pattern="Ethernet107/1/22" '$0 ~ pattern,/^$/' fichier

  7. #7
    Membre à l'essai
    Homme Profil pro
    Inscrit en
    Mars 2013
    Messages
    6
    Détails du profil
    Informations personnelles :
    Sexe : Homme

    Informations forums :
    Inscription : Mars 2013
    Messages : 6
    Par défaut
    Bonjour,

    Bon et bien que dire :-O

    Quel rapidité à vous !

    Je viens de tester VOS solutions, elles fonctionnent !
    C'est parfait et je viens d'enrichir un peu plus mes connaissances sur ces commandes

    Un grand merci ça fonctionne au poil !

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

Discussions similaires

  1. [FPDF] Extraire le texte d'un fichier PDF
    Par brune38 dans le forum Bibliothèques et frameworks
    Réponses: 3
    Dernier message: 13/10/2009, 10h26
  2. Réponses: 3
    Dernier message: 21/05/2008, 18h24
  3. [COM] Extraire le texte d'un fichier "word" (.doc) avec
    Par ptikiwi dans le forum Bibliothèques et frameworks
    Réponses: 6
    Dernier message: 09/06/2006, 17h06
  4. EXTRAIRE DU TEXTE
    Par chekibperl dans le forum Langage
    Réponses: 5
    Dernier message: 21/10/2005, 18h23
  5. Extraire du texte et réafficher la suite
    Par freud dans le forum ASP
    Réponses: 4
    Dernier message: 20/06/2005, 09h06

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