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 23/05/2011, 12h50   #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 Interchangement de chaine dans ligne

Bonjour,

Je tiens d'abord à signaler que je suis débutant en langage unix.

Contexte :
Je crée des script unix sous windows grace à cygwin afin de formater des fichiers de log d'un serveur de ma boite.


Problème:
J'utilise la commande sed afin de trier tout cela, et j'aimerais effectuer grâce à cette commande un interchangement de chaine dans une ligne.

Plus explicitement, j'aimerais changer le format de la date qui est de la forme

Code :
dd/mm/yyyy ------> yyyy/mm/dd
Ma réflexion porte sur l'utilisation de la commande sed, j'ai vu qu'elle était très puissante, qu'elle permet de rechercher des chaines, de les remplacer/supprimer, de mettre des variables en tampon (mémoire annexe/principale).

Je vous présente une ligne de mon fichier de log :

Code :
IP;logname;dd/mm/yyyy;url
J'espère avoir été assez explicite.

Merci beaucoup

Bonne journée à tous
akalys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/05/2011, 14h35   #2
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
j'ai découvert ce smiley l'autre jour, donc j'en profite



Sinon, en version simple, tu as:
Code :
$ echo "IP;logname;dd/mm/yyyy;url" | sed 's#;\(\d\d\)/\(\d\d\)/\(\d\d\d\d\);#;$3/$2/$1;#'
Code :
's#;\(\d\d\)/\(\d\d\)/\(\d\d\d\d\);#;$3/$2/$1;#
étant une expression rationnelle indiquant :

s#blah#bleh#
remplace blah par bleh

Ici, blah vaut ;\(\d\d\)/\(\d\d\)/\(\d\d\d\d\);, c'est à dire un point-virgule suivi de deux chiffres (\d) suivi d'un slash /, suivi de deux chiffres (\d) etc. et terminé par un point-virgule.
Les parenthèses (qui sont échappées) servent à mémoriser ce qui est trouvé dans des variables. Le premier couple de parenthèse \(\d\d\) mémorise donc les deux premiers chiffres etc.

bleh vaut quand à lui tout simplement ;$3/$2/$1;, c'est à dire qu'on remet les point-virgules (car on va remplacer toute la première chaine par la seconde, et comme les points-virgules sont présents dans la première chaîne, il faut les remettre ici) suivi de $3, c'est à dire le contenu du troisième couple de parenthèses de la première partie (l'année), puis un slash, puis $2 (deuxième couple : le mois), etc. et on termine par un dernier point-virgule...

edit : pour info, sed existe en version windows.
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 23/05/2011, 14h53   #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
avec awk
Code :
1
2
 echo "IP;logname;dd/mm/yyyy;url" | awk -F\; '{ split($3,DATE,"/") ; $3=DATE[3]"/"DATE[2]"/"DATE[1]  ; print  $0 }'
becket est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 24/05/2011, 08h26   #4
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,

Citation:
Envoyé par Alek-C Voir le message
Sinon, en version simple, tu as:
Code :
 sed 's#;\(\d\d\)/\(\d\d\)/\(\d\d\d\d\);#;$3/$2/$1;#'
edit : pour info, sed existe en version windows.
Euh... ne serait-ce pas plutôt "\3 \2 \1" ???

Sinon en fonction de la version de "sed" sous Cygwin, ceci devrait passer :

Code :
1
2
3
4
$ echo "IP;logname;dd/mm/yyyy;url" | sed  -r 's#(..)/(..)/(....)#\3/\2/\1#'
IP;logname;yyyy/mm/dd;url

$
Citation:
edit : pour info, sed existe en version windows.
Attention toutefois aux quotes à employer autour des commandes... si mes souvenirs sont bons pour avoir eu à l'utiliser quelques fois, il faut utiliser systématiquement des quotes doubles et non des quotes simples. A vérifier tout de même
__________________
$ 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 24/05/2011, 09h35   #5
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
Bonjour,

Tout d'abord merci pour la rapidité et surtout pour la simplicité de la réponse !

Je me voyais déja avec une tartine de ligne, et quand j'ai vu vos réponse ....

Enfin bref, merci pour le awk également, cette commande me fesais peur mais en fin de compte pour erffectuer la manipulation désirée, elle est assez explicite.

Je vais maintenant tester tout cela sur mon fichier.



akalys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 10h36   #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
Citation:
Envoyé par zipe31 Voir le message
Euh... ne serait-ce pas plutôt "\3 \2 \1" ???
Bien sûr que si... décidément, j'enchaîne les boulettes ces temps ci (soit dit en passant, je trouve dommage qu'aucun de mes 2 messages totalement erronés n'aient de votes négatifs alors que d'autres messages pourtant corrects en ont...)

D'ailleurs, je ne suis même pas certain que \d fonctionne... en tout cas, chez moi ça ne marche pas

Et sous windows, tu ne peux pas utiliser les '

A force de mélanger perl et sed...

Code :
1
2
3
4
$ echo a1a | sed 's/\d//'
a1a
$ echo a1a | sed 's/[0-9]//'
aa
Bref, donc on peut partir sur ça:
Code :
echo "IP;logname;13/06/2011;url" | sed 's#;\([0-9][0-9]\)/\([0-9][0-9]\)/\([0-9][0-9][0-9][0-9]\);#;\3/\2/\1;#'
Et en perl donc ($1 marche aussi bien que \1 ) :
Code :
1
2
3
4
$ echo "IP;logname;13/06/2011;url" | perl -pe 's#;(\d{2})/(\d{2})/(\d{4});#;\3/\2/\1;#'
IP;logname;2011/06/13;url
$ echo "IP;logname;13/06/2011;url" | perl -pe 's#;(\d{2})/(\d{2})/(\d{4});#;$3/$2/$1;#'
IP;logname;2011/06/13;url
Alek-C est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 14h32   #7
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
Merci pour ces compléments de réponse,

Voici la commande pour laquelle j'ai opté qui permet donc d'effectuer cette permutation au sein d'un fichier :

Code :
sed  -r 's#(..)/(...)/(....)#\3/\2/\1#' fich
J'ai une petite question subsidiaire sur laquelle je planche afin de compléter mon petit projet d'épuration des log serveurs, je vous en fais part dans un nouveau topic (je pense que c'est mieux)
akalys est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 24/05/2011, 19h26   #8
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
Citation:
Envoyé par akalys Voir le message
Voici la commande pour laquelle j'ai opté qui permet donc d'effectuer cette permutation au sein d'un fichier :
Code :
sed  -r 's#(..)/(...)/(....)#\3/\2/\1#' fich
T'es sûr de ton mois avec 3 caractères ???
__________________
$ 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
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 15h08.


 
 
 
 
Partenaires

Hébergement Web