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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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
    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 660
    Détails du profil
    Informations personnelles :
    Localisation : France

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

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    grep -f identifiant log > resultat
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    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 confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 292
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 292
    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
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 835
    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 835
    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...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

  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,
    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 confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 349
    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 349
    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
    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

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