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 :

Extraction de lignes dans un fichier


Sujet :

Shell et commandes GNU

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2014
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Juin 2014
    Messages : 1
    Points : 1
    Points
    1
    Par défaut Extraction de lignes dans un fichier
    Avant toute chose je suis désolé si une question similaire a déjà été postée...Mais je fais face à un gros souci au boulot (je suis donc totalement accaparé) et je ne suis pas spécialiste des commandes linux !

    Voilà J'ai besoin de votre aide sur le problème suivant :
    J'ai un fichier "identifiant" -environ 200 lignes et un fichier "log" (environ 300 000 lignes)
    Je veux extraire en ligne de commande ou script, dans un troisième fichier qui s’appellera "resultat" toutes les lignes du fichier log qui contiennent un identifiant. C'est probablement très bête à faire mais je n'y arrive pas et je manque cruellement de temps !!! Grrrr...

    Pour info :
    - extrait de mon fichier identifiant (chaque ligne est un identifiant)
    JGTOZM
    JODZBN
    RCXPZS

    - extrait de mon fichier log (lignes que je souhaite extraire dans un fichier "resultat" car les identifiants sont présents)

    Ligne[13366] [Jun 24 10:54:33 2014] [error] [client JGTOZM] (12357)The timeout specified has expired
    ...
    Ligne[215497] [Jun 25 16:27:47 2014] [error] [client RCXPZS] (23334)Error reading
    ...
    Ligne[224634] [Jun 26 11:08:69 2014] [error] [client JODZBN] (29827)...


    Voilà j'espère être clair, merci par avance de vos réponses et donc de votre aide

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

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -f identifiant log > resultat

  3. #3
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Bonjour,
    Tu peux le faire effectivement simplement avec la commande grep:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -f fichier_identifiant fichier_log >fichier_destination
    Battu sur le fil

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 271
    Points : 13 536
    Points
    13 536
    Par défaut
    Bonjour,

    Difficile de mettre son grain de sel après deux excellentes réponses.
    Alors, je vais mettre un grain de sed.

    Si le fichier parle de ces clients à un autre endroit dans le fichier, et si on ne veut que la balise, on peut faire:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.\+/[client &]/' fichier_identifiant|grep -f - fichier_log >resultat
    (non testé)

  5. #5
    Expert éminent sénior
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 721
    Points : 31 044
    Points
    31 044
    Billets dans le blog
    1
    Par défaut
    Bonjour
    Citation Envoyé par Flodelarab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.\+/[client &]/' fichier_identifiant|grep -f - fichier_log >resultat
    (non testé)
    Ben moi j'ai testé, et ça ne fonctionne pas.
    Voilà déjà le résultat de ton grain de sed
    Code bash : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ sed 's/.\+/[client &]/' log
    [client Ligne[13366] [Jun 24 10:54:33 2014] [error] [client JGTOZM] (12357)The timeout specified has expired]
    [client Ligne[215497] [Jun 25 16:27:47 2014] [error] [client RCXPZS] (23334)Error reading]
    [client Ligne[224634] [Jun 26 11:08:69 2014] [error] [client JODZBN] (29827)...]
    Donc déjà là, je ne vois pas en quoi rajouter "[client" en début de ligne empêchera les faux positifs...

  6. #6
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Salut,
    Citation Envoyé par Sve@r Voir le message
    Ben moi j'ai testé, et ça ne fonctionne pas.
    […]
    Donc déjà là, je ne vois pas en quoi rajouter "[client" en début de ligne empêchera les faux positifs...
    Parce que c'est sur l'autre fichier (fichier_identifiant) qu'il faut appliquer la commande sed et non sur fichier_log

    Par contre, pour que ça marche, il faut protéger les crochets, sans quoi il y a des soucis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -f <(sed 's/.\+/\\[client &\\]/' fichier_identifiant) fichier_log

  7. #7
    Expert éminent sénior Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 309
    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 309
    Points : 12 817
    Points
    12 817
    Par défaut
    Si chacun rajoute sa petite touche personnelle, voici une version gawk qui fonctionne sur les inputs proposés (pour ceux qui trouvent sed dur à lire ):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    gawk -F'[][]' '{FNR==NR?A["client "$0]=1:A[$8]==1?X=1:X=0}X' fic.id fic.log

  8. #8
    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
    Points : 5 849
    Points
    5 849
    Par défaut
    Citation Envoyé par zipe31 Voir le message
    Par contre, pour que ça marche, il faut protéger les crochets, sans quoi il y a des soucis
    Et s'il y a(vait) des étoiles dans les identifiants? (ou d'autres trucs qui gênent)

    Il existe une commande qui s'appelle 'fgrep' (pour "fixed grep" (et non "fast grep"...)), qui correspond à l'option -F (--fixed-strings) et qui permet de chercher un texte littéralement (et non une expression régulière). Il suffit donc d'ajouter un caractère à ta solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.\+/[client &]/' fichier_identifiant|fgrep -f - fichier_log >resultat

  9. #9
    Expert éminent

    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
    Points : 6 276
    Points
    6 276
    Par défaut
    Citation Envoyé par jack-ft Voir le message
    Et s'il y a(vait) des étoiles dans les identifiants? (ou d'autres trucs qui gênent)

    Il existe une commande qui s'appelle 'fgrep' (pour "fixed grep" (et non "fast grep"...)), qui correspond à l'option -F (--fixed-strings) et qui permet de chercher un texte littéralement (et non une expression régulière). Il suffit donc d'ajouter un caractère à ta solution:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/.\+/[client &]/' fichier_identifiant|fgrep -f - fichier_log >resultat
    Bien vu

Discussions similaires

  1. Extraction des lignes d'un fichier txt dans un tableau
    Par med.ben235 dans le forum Débuter
    Réponses: 1
    Dernier message: 28/04/2014, 17h56
  2. [FSO] Effacer une ligne dans un fichier
    Par Johnbob dans le forum ASP
    Réponses: 4
    Dernier message: 30/05/2007, 16h23
  3. [Fichier] Nombre de ligne dans un fichier texte
    Par NewSer dans le forum Entrée/Sortie
    Réponses: 7
    Dernier message: 10/11/2004, 16h58
  4. Réponses: 2
    Dernier message: 02/03/2004, 19h38
  5. Supprimer une ligne dans un fichier
    Par sbeu dans le forum Langage
    Réponses: 3
    Dernier message: 13/05/2003, 10h30

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