Précédent   Forum des professionnels en informatique > Systèmes > Autres systèmes > Unix
Unix Forum d'entraide sur les systèmes Unix et dérivés (*BSD, AIX, etc.). Avant de poster ->F.A.Q BSD F.A.Q. Aix
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 24/05/2011, 15h11   #1
Invité de passage
 
Inscription : décembre 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 14
Points : 2
Points : 2
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 :
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 :
IP;Logname;yyyy/mm/dd;UseCase
J'ai à disposition une table de donnée au format txt, associant les UseCase à une action, exemple :

Code :
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 :
IP;Logname;yyyy/mm/dd;AD010
Obtenir :

Code :
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
akalys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 16h56   #2
Invité de passage
 
Inscription : décembre 2008
Messages : 14
Détails du profil
Informations forums :
Inscription : décembre 2008
Messages : 14
Points : 2
Points : 2
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
akalys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 17h50   #3
Membre Expert
 
Avatar de becket
 
Frédéric Brugmans
Informaticien multitâche
Inscription : février 2005
Messages : 661
Détails du profil
Informations personnelles :
Nom : Frédéric Brugmans

Informations professionnelles :
Activité : Informaticien multitâche

Informations forums :
Inscription : février 2005
Messages : 661
Points : 1 196
Points : 1 196
C'est tout à fait le genre de chose ou awk est tout à fait adapté
becket est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 18h09   #4
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C
Je n'ai pas de réponse en awk, mais avec perl, un truc comme ça devrait marcher :

Code :
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 :
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
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/05/2011, 08h21   #5
Expert Confirmé
 
Inscription : janvier 2011
Messages : 970
Détails du profil
Informations personnelles :
Localisation : France, Haute Garonne (Midi Pyrénées)

Informations forums :
Inscription : janvier 2011
Messages : 970
Points : 2 871
Points : 2 871
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 :
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 :
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 :
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 :
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.
zipe31 est actuellement connecté   Envoyer un message privé Réponse avec citation 10
Vieux 25/05/2011, 09h26   #6
Membre Expert
 
Homme Alexis
Intégrateur d'Exploitation
Inscription : février 2003
Messages : 876
Détails du profil
Informations personnelles :
Nom : Homme Alexis
Âge : 32
Localisation : France

Informations professionnelles :
Activité : Intégrateur d'Exploitation
Secteur : Biens de consommation

Informations forums :
Inscription : février 2003
Messages : 876
Points : 1 619
Points : 1 619
Envoyer un message via ICQ à Alek-C Envoyer un message via Skype™ à Alek-C

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
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 14h17.


 
 
 
 
Partenaires

Hébergement Web