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 :

[bash] grep sur une partie d'un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut [bash] grep sur une partie d'un fichier
    Bonjour à tous,

    Je fais rarement du bash et il s'avère que je suis bloqué.

    Je vous explique :
    1. Je recherche une chaîne dans un fichier File1 et je récupère la ligne où cette chaîne se trouve. (ligne 12 du script)
    2. Je recherche la première fois qu'une seconde chaîne apparaît à partir de la ligne du 1. (ligne 15 du script)

    Actuellement, j'ai ce script :
    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
    #!/bin/bash
     
    GroupDuplicated=Doublon.txt
    ConfigurationFile=Conf.txt
    #CPT=0
    #echo CPT=${CPT}
    for ligne in `cat ${GroupDuplicated}`
    do
            #CPT=`expr ${CPT} + 1`
            echo "GROUPE=$ligne"
            sleep 2
            StartLine=`grep -nE "object-group network $ligne" $ConfigurationFile | awk -F ":" '{print $1;}'`
            echo $StartLine
            Content=cat $ConfigurationFile | awk "NR>$StartLine"
            EndLine=`grep -nE "object-group" $Content | awk -F ":" '{print $1;}'`
            sleep 2
            echo $EndLine
    done
    #echo ${CPT}
    L'affectation de la variable EndLine ne retourne aucun résultat (ligne 15)

    Avez-vous des pistes ?

    Merci
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

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

    Informations forums :
    Inscription : Février 2008
    Messages : 7 549
    Points : 19 378
    Points
    19 378
    Par défaut
    Bonjour,

    réponse rapide :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Content=$(cat $ConfigurationFile | awk "NR>$StartLine")
    réponse détaillée :
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Bonjour,

    Voici quelques exemples qui peuvent t'aider (ici, je recherche les 2 premières lignes où l'on trouve le mot "File") :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    $ grep -n "File" xx.tx 
    11: File 12180
    17: File 12340
    23: File 12500
    29: File 12660
    $ grep -m 2 -n "File" xx.tx 
    11: File 12180
    17: File 12340
    $ read -d "" start end < <(grep  -m 2 -n 'File' xx.tx | cut -d: -f1)
    $ echo $start
    11
    $ echo $end
    17
    Cordialement.

  4. #4
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    Bonjour,

    D'accord, je prends en compte vos messages.

    J'ai commencé le reformatage du script.

    J'obtiens ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #!/bin/bash
     
    GroupDuplicated=Doublon.txt
    ConfigurationFile=Conf.txt
     
    while read Ligne
    do echo "$Ligne"
            awk 'BEGIN { print "On cherche la ligne avec la variable Ligne"; FS=" "}
            $3 =="$Ligne" { print "Groupe "$3}
            END { print "Vérification terminé"} ' $ConfigurationFile
    done < $GroupDuplicated
    J'essaye de convertir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    StartLine=`grep -nE "object-group network $ligne" $ConfigurationFile | awk -F ":" '{print $1;}'`
    echo $StartLine
    avec un seul awk.
    Je recherche le numéro de la ligne du match.
    La ligne recherchée est de la forme : object-group network $Ligne (d'où mon $3 dans le awk).

    EDIT : Erreur stupide => J'avais mis un espace dans ma comparaison "==".

    Le awk fonctionne mais ne retourne pas le numéro de ligne. J'investigue dessus.
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

  5. #5
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    C'est quoi ton besoin exactement, car je ne vois pas l'utilité de awk ici à part pour remplacer cut ?
    Cordialement.

  6. #6
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    N_BaH a spécifié dans son message que grep + awk équivalait à un awk donc j'essaye de transformer mon grep -nE | awk par un awk tout simplement.
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Est-ce que ton besoin est de retrouver les 2 premières lignes avec l'occurence "object-group network $ligne" ?

    ce qui correspondrait à:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -m 2 -n "object-group network $ligne" $ConfigurationFile
    Si c'est ça, tu n'as plus qu'à couper le surplus et à mettre dans tes variables StartLine et EndLine.
    Cordialement.

  8. #8
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    J'ai deux besoins :

    Le premier est de retrouver le numéro de la ligne qui contient "object-group network $Ligne".
    Le deuxième est de retrouver le numéro de la ligne qui contient "object-group" à partir de la ligne de mon premier besoin.

    Ensuite avec ses deux numéros de lignes, je vais récupérer ce qu'il y a entre et extraire les informations dont j'ai besoin.

    Avec la première réponse de ce fil, je peux avoir les deux numéros de ligne.

    Ma question est de savoir si mon code est propre (apparemment non d'après N_BaH)
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

  9. #9
    Expert éminent sénior Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 243
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 243
    Points : 13 458
    Points
    13 458
    Par défaut
    Bonjour

    je vais récupérer ce qu'il y a entre et extraire les informations dont j'ai besoin
    Pour en faire quoi ?
    Tu vois bien que tu nous donnes des sous-objectifs.
    Cette réponse vous apporte quelque chose ? Cliquez sur en bas à droite du message.

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

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

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 035
    Points : 8 400
    Points
    8 400
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Est-ce que ton besoin est de retrouver les 2 premières lignes avec l'occurence "object-group network $ligne" ?
    je pense pas, comme je le comprends il n'y a qu'une seule occurrence de "object-group network $ligne" (pour une $ligne donnée)
    le but est de s'arrêter à la prochaine occurrence de "object-group", soit possiblement "object-group network TOTO" avec TOTO != $ligne

    via awk ça donnerait une tournure de ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    awk -f - <<EOF fichier
    /object-group network coincoin/ {
        seen = 1;
        print NR;
        next;
    }
     
    /object-group/ && seen == 1 {
       print NR;
       exit(0);
    }
    EOF
    on considère les fichiers groupes.txt et config.txt suivants respectivement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    object-group network coincoin
    coincoin-machin
    coincoin-truc
    coincoin-bouzin
    object-group network pouet
    pouet-bla
    pouet-pouet
    pouet-bouzin
    pouet-machin
    pouet-truc
    object-group network toto
    toto-bidule
    toto-coincoin
    on peut alors envisager un truc comme ça :
    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
    #!/bin/bash
     
    GroupDuplicated="groupes.txt"
    ConfigurationFile="config.txt"
     
    while read ligne; do
      echo "GROUPE=$ligne"
      awk -vstartpattern="object-group network $ligne" -vstoppattern="object-group" -f- <<EOF $ConfigurationFile
        \$0 ~ startpattern {
          seen = 1;
          startline = NR;
          next;
        }
     
        \$0 ~ stoppattern && seen == 1 {
          seen = 2;
          nblines = NR - startline;
          exit(0);
        }
     
        END {
          if (seen != 2) {  # check sur la fin de fichier
            nblines = NR - startline + 1;
          }
          printf ("le paragraphe commence a la ligne %d et tient sur %d lignes (ligne de fin = %d)\n", startline, nblines, startline + nblines)
        }
    EOF
    done < $GroupDuplicated
    et le résultat :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    GROUPE=toto
    le paragraphe commence a la ligne 11 et tient sur 3 lignes (ligne de fin = 14)
    GROUPE=coincoin
    le paragraphe commence a la ligne 1 et tient sur 4 lignes (ligne de fin = 5)
    GROUPE=pouet
    le paragraphe commence a la ligne 5 et tient sur 6 lignes (ligne de fin = 11)

  11. #11
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 277
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur intégration
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Décembre 2012
    Messages : 4 277
    Points : 12 722
    Points
    12 722
    Par défaut
    Mouais, le plus adapté pour récupérer un paragraphe dont la regex qui délimite celui-ci est identique de chaque coté est sed:
    Le fichier à parser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    $ cat yy.txt
    BOB
    COB
    AOB
    BOB
    COB
    XOB
    Le paragraphe qui m'interesse ici, est ce qui ce trouve entre COB et COB (COB compris)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    $ sed -n '/COB/,/COB/p' yy.txt
    COB
    AOB
    BOB
    COB
    Mais comme le dit Flodelarab, avoir juste un besoin partiel, ne peut ramener qu'une solution partielle (et bien souvent inadaptée).
    Cordialement.

  12. #12
    Membre émérite

    Homme Profil pro
    Ingénieur Réseaux
    Inscrit en
    Juin 2012
    Messages
    877
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur Réseaux
    Secteur : Conseil

    Informations forums :
    Inscription : Juin 2012
    Messages : 877
    Points : 2 427
    Points
    2 427
    Par défaut
    Bonjour,

    Alors le but est de retrouver les adresses IP des groupes présents dans mon fichier Doublon.txt

    Je dois donc :
    - lire chaque ligne de mon fichier Doublon
    - rechercher l'occurence "object-group network $Ligne"
    - récupérer les lignes inférieures (nombre variable suivant les groupes d'où le match sur "object-group" ensuite) pour avoir la déclaration des hosts IP.

    Le script de BufferBob est fonctionnel; il me manque juste la récupération des lignes comprises dans les plages et le découpage pour avoir l'information souhaitée.

    Par contre, le script n'est pas de mon niveau ,je vais faire des recherches.
    Si la réponse vous a été donnée, pensez au Tag .
    Un petit aide à se sentir utile. Merci.

    "La folie. C'est de faire et refaire la même chose en espérant que le résultat sera différent."
    Albert Einstein

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

Discussions similaires

  1. Réponses: 1
    Dernier message: 28/01/2015, 15h05
  2. [CURL] Transférer une partie d'un fichier sur un serveur ftp
    Par nixmind dans le forum Administration système
    Réponses: 2
    Dernier message: 31/12/2014, 08h25
  3. tri sur une partie d'un champ
    Par yoline dans le forum Access
    Réponses: 4
    Dernier message: 19/09/2005, 11h25
  4. Réponses: 5
    Dernier message: 06/09/2005, 16h01
  5. Changement de couleur de police sur une partie d'un caption
    Par kobe dans le forum Composants VCL
    Réponses: 3
    Dernier message: 11/07/2005, 10h18

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