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 2 informations d'une même ligne avec un grep -oP


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Femme Profil pro
    Lycéen
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut Extraire 2 informations d'une même ligne avec un grep -oP
    Bonsoir,

    Je cherche a extraire des données d'un log (une date et un chiffre)

    Exemple de données que je cherche à extraire qui se trouve sur la même ligne :
    - la date formatée comme ceci : [JJ-MM-AAAA HH:MM:SS] INF
    - Un texte qui se trouve systématiquement après un chaine de caractère 'blabla: @TO:' et avant une chaine de caractère @CH

    J'ai réussi à taton à avancer mais je bloque pour tout regrouper :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    grep 'blabla @TO:' fichier.log                                   me retourne bien les lignes ou j'ai les 2 infos
    grep -oP '(?<=\[).*(?=\] INF)' fichier.log                  me retourne bien les lignes ou j'ai ma date entre crochets suivi de INF
    grep -oP 'blabla: @TO:\K.+?(?= @CH)' fichier.log      me retourne bien les lignes ou j'ai ma chaine de caractères
    Le soucis c'est que je n'arrive pas à trouver comment afficher les 2 informations qui m'interessent

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [JJ-MM-AAAA HH:MM:SS] XXX
    Je ne sais pas si je suis assez claire ?
    Peut etre que je ne suis pas partie sur la bonne commande ?

    Merci d'avance pour votre aide

  2. #2
    Expert confirmé Avatar de CosmoKnacki
    Homme Profil pro
    Justicier interdimensionnel
    Inscrit en
    Mars 2009
    Messages
    2 986
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Justicier interdimensionnel

    Informations forums :
    Inscription : Mars 2009
    Messages : 2 986
    Par défaut
    Je ne crois pas que tu puisses faire ça en un seul grep. Ce que tu peux faire c'est utiliser sed avec des groupes de captures pour isoler les informations qui t'intéressent et les afficher ensuite au format souhaité.

  3. #3
    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
    salut,

    je pense pas non plus qu'on puisse en un seul grep, niveau extraction si on considère 3 patterns A, B et C on peut truander en matchant "ABC|ACB|BAC|BCA|CAB|CBA", mais bon...
    mais ce qui pose problème c'est surtout la mise en forme, ce que match grep il l'affiche, et les parenthèses capturantes n'ont pas réellement d'effet

    de fait j'opterai probablement pour sed ou awk également

    sinon on peut aussi envisager une sorte de compromis du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    while read line; do
       grep -Po "B" <<< "$line"
       grep -Po "C" <<< "$line"
    done < <(grep -Po "A" fichier.log)
    on effectue ainsi moins de greps dans le vide...

  4. #4
    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
    Avec awk

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    gawk  '/@TO/,/@CH/{ if ($0 ~ /JJ-MM/) print $0  }' file

  5. #5
    Membre habitué
    Femme Profil pro
    Lycéen
    Inscrit en
    Décembre 2018
    Messages
    9
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Lycéen

    Informations forums :
    Inscription : Décembre 2018
    Messages : 9
    Par défaut
    Je ne suis pas sur que ma demande ai été comprise, voici mon fichier sur lequel je souhaite récupérer les infos

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    [15/01/19 19:25:27.640] INF (140080786159360) blabla: @TO:318 @CH:0  @MAX:1000
    [15/01/19 19:35:27.635] INF (140080786159360) blabla: @TO:306 @CH:0  @MAX:1000
    [16/01/19 00:15:27.636] INF (140080786159360) blabla: @TO:6 @CH:0  @MAX:1000
    [16/01/19 00:25:27.631] INF (140080786159360) blabla: @TO:57 @CH:0  @MAX:1000
    [16/01/19 00:35:27.635] INF (140080786159360) blabla: @TO:57 @CH:0  @MAX:1000
    [16/01/19 00:45:27.636] INF (140080786159360) blabla: @TO:55 @CH:0  @MAX:1000
    ...
    [16/01/19 03:05:27.636] INF (140080786159360) blabla: @TO:48 @CH:0  @MAX:1000
    [16/01/19 03:15:27.635] INF (140080786159360) blabla: @TO:48 @CH:0  @MAX:1000
    [16/01/19 03:25:27.635] INF (140080786159360) blabla: @TO:48 @CH:0  @MAX:1000
    [16/01/19 03:35:27.635] INF (140080786159360) blabla: @TO:48 @CH:0  @MAX:1000
    J'ai essayé la réponse de becket mais ca ne me retourne rien
    Celle de BufferBob, j'ai modifié B et C par mes expressions mais je ne sais pas quoi mettre en A :/
    La réponse de jack-ft me donne le même résultat que ma seconde commande (donc je n'ai pas l'heure correspondant à mon chiffre)

  6. #6
    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,

    En espérant avoir tout compris

    Il faut lire :
    Nom : dev.png
Affichages : 989
Taille : 1,1 Ko

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ sed -r 's/([^̂\]]*\]).*@TO:([^ ]*).*/\1 \2/' plop
    [15/01/19 19:25:27.640] 318
    [15/01/19 19:35:27.635] 306
    [16/01/19 00:15:27.636] 6
    [16/01/19 00:25:27.631] 57
    [16/01/19 00:35:27.635] 57
    [16/01/19 00:45:27.636] 55
    ...
    [16/01/19 03:05:27.636] 48
    [16/01/19 03:15:27.635] 48
    [16/01/19 03:25:27.635] 48
    [16/01/19 03:35:27.635] 48
    Edit : Ça commence à devenir pénible la mauvaise interprétation du code dans les balises

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique en retraite
    Inscrit en
    Avril 2008
    Messages
    2 103
    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 103
    Par défaut
    Citation Envoyé par snoopy2405 Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -oP 'blabla: @TO:\K.+?(?= @CH)' fichier.log      me retourne bien les lignes ou j'ai ma chaine de caractères
    Le soucis c'est que je n'arrive pas à trouver comment afficher les 2 informations qui m'interessent
    Tu peux le faire en supprimant le début et la fin de la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -oP 'blabla: @TO:\K.+?(?= @CH)' fichier.log | sed -e 's/^.*@TO://' -e 's/@CH.*//'
    évidemment les spécialistes de "sed" diront qu'il y a des manières beaucoup plus élégantes et rapides de faire...

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

Discussions similaires

  1. Réponses: 10
    Dernier message: 06/03/2018, 11h38
  2. [XL-2016] Répartir informations dans une même cellule en plusieurs lignes
    Par qleclerc974 dans le forum Excel
    Réponses: 0
    Dernier message: 17/02/2018, 00h37
  3. Réponses: 22
    Dernier message: 22/05/2013, 17h52
  4. Afficher les informations sur une même ligne
    Par JayenseN dans le forum PL/SQL
    Réponses: 2
    Dernier message: 24/05/2012, 15h12
  5. Comment afficher une liste sur la même ligne avec tous les navigateurs
    Par Alexandrebox dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 25/07/2010, 03h05

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