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 :

Travail sur un fichier - sed / tr / awk / autre


Sujet :

Shell et commandes GNU

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut Travail sur un fichier - sed / tr / awk / autre
    Bonjour,

    J'essaie de travailler sur un fichier de log afin de pouvoir l'utiliser pour des stats/alertes/affichage etc ...

    Mon fichier :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    User1
    Message: [none]
    User2
    Message: [none]
    User3
    Message: une_date1
    User4
    Message: [none]
    User5
    Message: une_date2
    avec une_dateX du type : Wed Apr 8 17:0:00 CEST 2015

    Et je souhaite avoir un résultat du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    User1;Message: [-1
    User2;Message: [-1]
    User3;Message: une_date1_au_format_timestamp
    User4;Message: [-1]
    User5;Message: une_date2_au_format_timestamp
    J'ai essayé pas mal de chose avec du sed / tr mais :
    - 1ere difficulté : Passer un couple de ligne sur une seule ligne
    - 2eme difficulté : Changer le format de la date

    J'ai pas mal googlisé mais sans réellement faire avancer mon schmillblick. Si qqun pouvait me mettre sur la voie, ça serait fort urbain de votre part.

    Merci d'avance.

    Wagab

  2. #2
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    salut,

    si on part du principe que le fichier est formaté de la sorte tout le long (pas de saut de ligne hasardeux par exemple), en awk :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ awk 'NR%2 {s=$0;next} {print s ";" $0}' fichier
    User1;Message: [none]
    User2;Message: [none]
    User3;Message: une_date1
    User4;Message: [none]
    User5;Message: une_date2
    • la condition NR%2 sert à déterminer si on est sur un numéro de ligne pair ou impair
    • si on est sur une ligne impaire, on stocke la ligne dans la variable s, et on passe à la ligne suivante avec next
    • si on est sur une ligne paire, c'est que s a déjà été remplie au tour précédent, donc on affiche s, le point-virgule ;, et la ligne courante $0

  3. #3
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Bonjour,

    Une autre solution (qui montre l'utilité de "cat" ) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ cat fichier | paste -d\;  - -
    User1;Message: [none]
    User2;Message: [none]
    User3;Message: une_date1
    User4;Message: [none]
    User5;Message: une_date2

  4. #4
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    Citation Envoyé par disedorgue Voir le message
    Une autre solution (qui montre l'utilité de "cat" ) :
    hinhinhin paste -d\; - - < fichier

  5. #5
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Alors là, je suis d'avoir fait cette erreur de débutant

  6. #6
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Je vais regarder ça. Merci les gens

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Yes ca fonctionne pour ma 1ère problématique, c'est cool. Je savais que awk allait répondre cette problématique mais j'ai eu beau cherché, j'ai pas trouvé. J'avoue, j'ai pas non plus étudié le man à fond, juste lu et regardé si qqch m'allait (mais à priori mal lu).

    Par contre, vous avez une idée pour ma 2e problématique ? J'ai bien une idée mais je ne sais pas comme écrire cela.
    Du genre, je fais cat du fichier avec un grep -v none et je dis de prendre la fin de la ligne et de la transformer grâce à la commande : date -d '$date' +%s . Maintenant, je ne sais pas comment faire ? Avec un cut et m'amuser à prendre les 6 dernières colonnes ? Pour info, ma date est à ce format : Wed Apr 8 17:0:00 CEST 2015 et je la veux en timestamp (nombre de seconde depuis 1er janvier 1970).

    Merci encore de votre aide.

    Wagab

  8. #8
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Ok,

    Donne un vrai exemple que l'on puisse trouver une solution en une seule passe.

  9. #9
    Expert confirmé Avatar de BufferBob
    Profil pro
    responsable R&D vidage de truites
    Inscrit en
    Novembre 2010
    Messages
    3 041
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : responsable R&D vidage de truites

    Informations forums :
    Inscription : Novembre 2010
    Messages : 3 041
    Par défaut
    hello,

    Citation Envoyé par Wagabow Voir le message
    Je savais que awk allait répondre cette problématique
    note que la solution de disedorgue est un poil plus courte et à mon sens un peu plus élégante quand même

    Par contre, vous avez une idée pour ma 2e problématique ? J'ai bien une idée mais je ne sais pas comme écrire cela.
    Du genre, je fais cat du fichier avec un grep -v none et je dis de prendre la fin de la ligne et de la transformer grâce à la commande : date -d '$date' +%s . Maintenant, je ne sais pas comment faire ? Avec un cut et m'amuser à prendre les 6 dernières colonnes ? Pour info, ma date est à ce format : Wed Apr 8 17:0:00 CEST 2015 et je la veux en timestamp (nombre de seconde depuis 1er janvier 1970).
    je te propose, toujours en awk et moyennant un fichier de test :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    $ cat > fichier
    toto none
    coincoin truc bidule machin pouet Wed Apr 8 17:0:00 CEST 2015
    bla pouet none truc
    bouzin Tue Jun 23 03:26:52 CEST 2014
    $ awk '/^$|none/ {next} {s=""; for(i=0; i<6; i++) {s=$(NF-i) " " s}; print s}' fichier | xargs -ITOTO date -d"TOTO" +%s
    1428505200
    1403486812

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 408
    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 408
    Par défaut
    Un exemple complet en sed:
    Le fichier exemple:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    $ cat wagabon.txt
    User1
    Message: [none]
    User2
    Message: [none]
    User3
    Message: Wed Apr 8 17:0:00 CEST 2015
    User4
    Message: [none]
    User5
    Message: Wed Apr 9 17:10:00 CEST 2015
    La commande sed:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $ sed -e 'N;s/\n/;/;/none/!s/\(.*: \)\(.*\)/date --date="\2" "+\1%s"/e' wagabon.txt
    User1;Message: [none]
    User2;Message: [none]
    User3;Message: 1428505200
    User4;Message: [none]
    User5;Message: 1428592200

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    25
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Juillet 2007
    Messages : 25
    Par défaut
    Merci à vous deux, ça fonctionne nikel.

    Maintenant, il ne me reste qu'à maîtriser ces commandes et les options qui vont bien afin de comprendre tout ce qu'il se passe dans ce que vous m'avez fourni et surtout de ne plus venir vous embêter sur ce genre de sujet (mais c'est pas gagné )

    Merci encore
    Wagab

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

Discussions similaires

  1. [OpenDoc] Travailler sur un fichier OD avec C++, C# et XSLT
    Par oodini dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 09/03/2007, 11h44
  2. travailler sur un fichier csv
    Par james2606 dans le forum Langage
    Réponses: 3
    Dernier message: 24/01/2007, 11h27
  3. Aide sur les commandes sed et awk
    Par elkhy dans le forum Shell et commandes GNU
    Réponses: 6
    Dernier message: 20/06/2006, 09h22
  4. Réponses: 7
    Dernier message: 23/03/2005, 23h23
  5. [Excel] Travailler sur un fichier excel existant
    Par scoder dans le forum Bibliothèques et frameworks
    Réponses: 2
    Dernier message: 26/10/2004, 13h54

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