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

Unix Discussion :

substituer une chaine par une autre d'un fichier externe


Sujet :

Unix

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 10
    Points
    10
    Par défaut substituer une chaine par une autre d'un fichier externe
    Bonjour !

    Voici la seconde partie de mon épuration des logs.

    Je rappel la situation:

    J'ai donc des logs serveur que je dois "épurer" afin de faciliter leur lecture.

    Mon avancé :

    J'ai donc mon fichier de log qui commence à prendre forme, une petite ligne en exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IP;Logname;yyyy/mm/dd;URL
    Maintenant, afin de savoir qui à fais quoi à quel heure, je veux faire correspondre cette URL qui est en fait réduit à un UseCase unique correspondant à une action précise.

    donc clairement mes lignes sont de la forme suivantes :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IP;Logname;yyyy/mm/dd;UseCase
    J'ai à disposition une table de donnée au format txt, associant les UseCase à une action, exemple :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    AD010;Faire cuire la compote
    J'ai donc mes deux fichiers: mon fich.txt (log) et mon tab.txt.

    Mon but est donc pour chaque ligne de mon fichier log, remplacer le UseCase

    par l'action correspondante, soit en entrée la ligne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IP;Logname;yyyy/mm/dd;AD010
    Obtenir :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    IP;Logname;yyyy/mm/dd;Faire cuire la compote

    J'ai essayer avec des commandes du type diff et autre, mais je pense qu'elle ne sont pas assez puissante.

    C'est pour cela que je pense que la commande sed peut encore effectuer ce dont j'ai besoin.

    Je suis donc en pleine recherche....

    Si quelqu'un aurais une piste.
    La commande sed est elle aproprié pour ce genre de chose?


    Merci

    et bonne journée

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    15
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 15
    Points : 10
    Points
    10
    Par défaut
    En fait j'aimerais simplement

    utiliser sed pour parcourir chaque ligne une par une et agir de la facon suivante


    subsitution du dernier argument de mon fichier de log par la chaine((recherche dans mon fichier tab de la chaine correspondant à la chaine (Dernier arg de mon fichier log)))


    le truc qu'il me manque serais de savoir comment par une recherche avec sed, rediriger le resultat de ma recherche vers une variable.

    Et ensuite imbriquer deux sed l'un l'autre

  3. #3
    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
    Points : 5 915
    Points
    5 915
    Par défaut
    C'est tout à fait le genre de chose ou awk est tout à fait adapté

  4. #4
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut
    Je n'ai pas de réponse en awk, mais avec perl, un truc comme ça devrait marcher :

    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
    #!/bin/perl
     
    use strict;
    use warnings;
    use Data::Dumper;
     
    open my $log, '<', 'log.txt';
    open my $use, '<', 'use.txt';
     
    my $use_case={};
     
    #generation des useCase:
    while (<$use>) {
            $use_case->{$1}=$2 if (/(\w+);(.*)/);
    }
     
    close $use;
     
    while (<$log>) {
            s#;(\d{2})/(\d{2})/(\d{4});(\w+)#;$3/$2/$1;$use_case->{$4}#;
            print;
    }
     
    close $log;
    à condition que le fichier de référence ne manque de rien (sinon, faut ajouter un traitement par défaut) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat log.txt
    IP;Logname10;01/03/2011;AD010
    IP;Logname20;02/04/2011;AD020
    IP;Logname10;03/04/2011;AD010
    $ cat use.txt
    AD010;Faire cuire la compote
    AD020;Faire fondre le miel
    $ perl prog.pl
    IP;Logname10;2011/03/01;Faire cuire la compote
    IP;Logname20;2011/04/02;Faire fondre le miel
    IP;Logname10;2011/04/03;Faire cuire la compote

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

    Ce que je te propose c'est de transformer ton fichier contenant les correspondances (fich.txt dans mon exemple) en fichier de commandes pour sed...

    Bien sûr je me base sur tes indications en espérant avoir tout bien compris...

    On a donc un ficher de correspondance ressemblant à ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ cat fich.txt                      
    AD010;Faire cuire la compote                           
    AD011;Faire cuire la tarte                             
    AD012;Faire cuire la bouillie
    On le transforme en fichier de commandes "sed" :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed -i.bak 's#^#s/#;s#;\|$#/#g' fich.txt                      
    
    $ cat fich.txt 
    s/AD010/Faire cuire la compote/   
    s/AD011/Faire cuire la tarte/     
    s/AD012/Faire cuire la bouillie/
    Notre fichier de référence ressemble à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat tab.txt
    IP;Logname;yyyy/mm/dd;AD010
    IP;Logname;yyyy/mm/dd;AD012
    IP;Logname;yyyy/mm/dd;AD010
    IP;Logname;yyyy/mm/dd;AD011
    IP;Logname;yyyy/mm/dd;AD011
    IP;Logname;yyyy/mm/dd;AD010
    IP;Logname;yyyy/mm/dd;AD012
    IP;Logname;yyyy/mm/dd;AD011
    IP;Logname;yyyy/mm/dd;AD010
    IP;Logname;yyyy/mm/dd;AD012
    Il ne reste plus qu'à appeler le fichier de commande "sed" et de parser ton fichier :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ sed -f fich.txt tab.txt
    IP;Logname;yyyy/mm/dd;Faire cuire la compote
    IP;Logname;yyyy/mm/dd;Faire cuire la bouillie
    IP;Logname;yyyy/mm/dd;Faire cuire la compote
    IP;Logname;yyyy/mm/dd;Faire cuire la tarte
    IP;Logname;yyyy/mm/dd;Faire cuire la tarte
    IP;Logname;yyyy/mm/dd;Faire cuire la compote
    IP;Logname;yyyy/mm/dd;Faire cuire la bouillie
    IP;Logname;yyyy/mm/dd;Faire cuire la tarte
    IP;Logname;yyyy/mm/dd;Faire cuire la compote
    IP;Logname;yyyy/mm/dd;Faire cuire la bouillie
    $ man woman
    Il n'y a pas de page de manuel pour woman.

  6. #6
    Membre chevronné

    Homme Profil pro
    Responsable projets techniques
    Inscrit en
    Février 2003
    Messages
    980
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Responsable projets techniques
    Secteur : Biens de consommation

    Informations forums :
    Inscription : Février 2003
    Messages : 980
    Points : 1 894
    Points
    1 894
    Par défaut

    Joli et excellente idée : c'est simple, efficace... rien à ajouter sauf peut-être de se méfier si par hasard il y avait des caractères spéciaux dans le fichier de correspondance

Discussions similaires

  1. remplacer les occurences d'un caractere dans une chaine par un autre
    Par lity7 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 14/03/2008, 12h02
  2. Réponses: 3
    Dernier message: 11/09/2007, 17h58
  3. Réponses: 2
    Dernier message: 31/07/2007, 14h23
  4. Réponses: 9
    Dernier message: 31/07/2007, 01h13
  5. remplacement d'une chaine par une autre
    Par zalalus dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 17/07/2006, 10h09

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