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 :

Interchangement de chaine dans ligne


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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    IP;logname;dd/mm/yyyy;url
    J'espère avoir été assez explicite.

    Merci beaucoup

    Bonne journée à tous

  2. #2
    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
    j'ai découvert ce smiley l'autre jour, donc j'en profite



    Sinon, en version simple, tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $ echo "IP;logname;dd/mm/yyyy;url" | sed 's#;\(\d\d\)/\(\d\d\)/\(\d\d\d\d\);#;$3/$2/$1;#'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    '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.

  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
    avec awk
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     echo "IP;logname;dd/mm/yyyy;url" | awk -F\; '{ split($3,DATE,"/") ; $3=DATE[3]"/"DATE[2]"/"DATE[1]  ; print  $0 }'

  4. #4
    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 Alek-C Voir le message
    Sinon, en version simple, tu as:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $ echo "IP;logname;dd/mm/yyyy;url" | sed  -r 's#(..)/(..)/(....)#\3/\2/\1#'
    IP;logname;yyyy/mm/dd;url
    
    $
    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.

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




  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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  7. #7
    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
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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)

  8. #8
    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 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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 21
    Dernier message: 01/04/2014, 21h06
  2. rechercher Chaine dans ligne
    Par debutVBA dans le forum VBScript
    Réponses: 2
    Dernier message: 25/01/2012, 13h42
  3. Réponses: 2
    Dernier message: 23/04/2009, 10h24
  4. Réponses: 1
    Dernier message: 22/04/2009, 22h39
  5. Réponses: 2
    Dernier message: 13/11/2008, 13h38

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