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 :

Remplacer une colonne dans un fichier texte en utilisant bash


Sujet :

Shell et commandes GNU

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre actif
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Par défaut Remplacer une colonne dans un fichier texte en utilisant bash
    Bonjour
    j'ai un fichier log comme suit
    log.txt
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [1614005098.68832942] Packet from adress-ip for mail.google.com. A with id 35813
    [1614005098.69140427] Packet from adress-ip for mail.google.com. AAAA with id 37977
    [1614005098.120580563] Packet from adress-ip for 15.27.226.41.in-addr.arpa. PTR with id 20819
    [1614005098.121961010] Packet from adress-ip for 18.173.111.176.in-addr.arpa. PTR with id 14802
    [1614005099.225108596] Packet from adress-ip for browser.pipe.aria.microsoft.com. A with id 43977
    [1614005099.242380560] Packet from adress-ip for browser.pipe.aria.microsoft.com. AAAA with id 45881
    Je veux remplacer la colonne 1 (date en format timestamp) par une date du format Mon Feb 22 15:44:49 CET 2021
    j'ai essayé ce script ( certainement il est loin d'être parfait)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    tr -d '[,]' < log.txt >> kilo.txt
     cut -d ' ' -f 1 kilo.txt >> log1.txt
     filename='log1.txt'
     function fctdate() { date -d "@$1"; }
     while read p; do
     fctdate $p
     done < $filename >> logfinal.txt
    il me reste que remplacer la colonne1 (timestamp) dans log.txt par la colonne1 (date avec nouvelle format) de logfinal.txt

    une idée svp ?
    cordialement

  2. #2
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    Bonjour,

    mais que c'est laid !
    ça devrait être fait tout de suite dans la boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read d reste; do d=${d//[][]/}; echo "[$(date -d @"$d")] $reste"; done <fic.in >fic.out
    et c'est tout.
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  3. #3
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Bonjour

    Existe-t-il vraiment un format de date qui mette la zone horaire entre l'heure et l'année ?

  4. #4
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 096
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 096
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    et c'est tout.
    Nan !

    J'ai testé avec dmesg dont j'ai envoyé la sortie dans un bête fichier texte, et ça se passe mal avec l'extraction de la date entre les crochets (que tu devrais expliquer parce que là, c'est vraiment hermétique).

    Voilà ce que j'obtiens avec d'abord la fin du fichier
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    # tail -n 5 dmsg.txt 
    [   17.286011] vboxdrv: fAsync=0 offMin=0x29a offMax=0xe46
    [   17.286066] vboxdrv: TSC mode is 'synchronous', kernel timer mode is 'normal'.
    [   17.286069] vboxdrv: Successfully loaded version 4.2.8 (interface 0x001a0004).
    [   17.982711] vboxpci: IOMMU not found (not registered)
    [  168.721213] device eth0 entered promiscuous mode
    et ensuite le fichier passé à ta ligne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # while read d reste; do d=${d//[][]/}; echo "[$(date +"%x %X" -d @"$d")] $reste"; done < dmsg-short.txt 
    date: date non valide «*@*»
    [] 17.286011] vboxdrv: fAsync=0 offMin=0x29a offMax=0xe46
    date: date non valide «*@*»
    [] 17.286066] vboxdrv: TSC mode is 'synchronous', kernel timer mode is 'normal'.
    date: date non valide «*@*»
    [] 17.286069] vboxdrv: Successfully loaded version 4.2.8 (interface 0x001a0004).
    date: date non valide «*@*»
    [] 17.982711] vboxpci: IOMMU not found (not registered)
    date: date non valide «*@*»
    [] 168.721213] device eth0 entered promiscuous mode
    (ligne que j'ai un poil modifiée au niveau du format, trouvant l'option de base trop longue à lire)

    On dirait bien qu'il y a un sac de nœuds avec les espaces après le crochet ouvrant,

  5. #5
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 096
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 096
    Par défaut
    Citation Envoyé par Jipété Voir le message
    On dirait bien qu'il y a un sac de nœuds avec les espaces après le crochet ouvrant,
    Confirmé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    $ while read d reste; do d=${d//[][]/}; echo $d $reste; done < dmsg-short.txt 
    17.286011] vboxdrv: fAsync=0 offMin=0x29a offMax=0xe46
    17.286066] vboxdrv: TSC mode is 'synchronous', kernel timer mode is 'normal'.
    17.286069] vboxdrv: Successfully loaded version 4.2.8 (interface 0x001a0004).
    17.982711] vboxpci: IOMMU not found (not registered)
    168.721213] device eth0 entered promiscuous mode
    $ while read d reste; do d=${d//[][]/}; echo $d $reste; done < log.txt 
    1614005098.68832942 Packet from adress-ip for mail.google.com. A with id 35813
    1614005098.69140427 Packet from adress-ip for mail.google.com. AAAA with id 37977
    1614005098.120580563 Packet from adress-ip for 15.27.226.41.in-addr.arpa. PTR with id 20819
    1614005098.121961010 Packet from adress-ip for 18.173.111.176.in-addr.arpa. PTR with id 14802
    1614005099.225108596 Packet from adress-ip for browser.pipe.aria.microsoft.com. A with id 43977

  6. #6
    Membre actif
    Inscrit en
    Février 2010
    Messages
    52
    Détails du profil
    Informations forums :
    Inscription : Février 2010
    Messages : 52
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    mais que c'est laid !
    ça devrait être fait tout de suite dans la boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read d reste; do d=${d//[][]/}; echo "[$(date -d @"$d")] $reste"; done <fic.in >fic.out
    et c'est tout.
    Merci beaucoup !!!

  7. #7
    Modérateur
    Avatar de N_BaH
    Profil pro
    Inscrit en
    Février 2008
    Messages
    7 640
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2008
    Messages : 7 640
    Par défaut
    Citation Envoyé par Jipété
    On dirait bien qu'il y a un sac de nœuds avec les espaces après le crochet ouvrant
    parce qu'il y a des espaces. alors, le premier champ (d) est uniquement le crochet ouvrant.
    on peut définir le crochet fermant en tant que séparateur de champ... ça implique d'autres manips, c'est pas la cata, mais ça ne correspondrait peut-être plus au cas de samirahal.

    tu es sur quelle distribution ?

    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # dmesg -T
    [lun. févr. 22 18:26:47 2021] ata1: link is slow to respond, please be patient (ready=0)                                                                                                                                                       
    [lun. févr. 22 18:26:49 2021] e1000e 0000:00:19.0 enp0s25: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                                                                                                           
    [lun. févr. 22 18:26:52 2021] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)                                                                                                                                                           
    [lun. févr. 22 18:26:52 2021] ata1.00: configured for UDMA/133
    .
    N'oubliez pas de consulter les cours shell, la FAQ, et les pages man.

  8. #8
    Expert confirmé
    Avatar de Jipété
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    11 096
    Détails du profil
    Informations personnelles :
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 11 096
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    ... ça ne correspondrait peut-être plus au cas de samirahal.
    Certes, mais j'avais pensé que ça pourrait être utile à d'autres.

    Citation Envoyé par N_BaH Voir le message
    tu es sur quelle distribution ?
    Debian.

    Et il suffit d'en parler pour que tu apportes la solution sur un plateau :
    Citation Envoyé par N_BaH Voir le message
    EDIT :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    # dmesg -T
    [lun. févr. 22 18:26:47 2021] ata1: link is slow to respond, please be patient (ready=0)                                                                                                                                                       
    [lun. févr. 22 18:26:49 2021] e1000e 0000:00:19.0 enp0s25: NIC Link is Up 1000 Mbps Full Duplex, Flow Control: Rx/Tx                                                                                                                           
    [lun. févr. 22 18:26:52 2021] ata1: SATA link up 3.0 Gbps (SStatus 123 SControl 300)                                                                                                                                                           
    [lun. févr. 22 18:26:52 2021] ata1.00: configured for UDMA/133
    Bien joué !
    Et merci,

  9. #9
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\[ *\([0-9.]\+\) *\]\(.*\)/echo -n "[ ";date -d @"\1";echo " \]\2"/e;s/\n//'

  10. #10
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Citation Envoyé par N_BaH Voir le message
    Bonjour,

    mais que c'est laid !
    ça devrait être fait tout de suite dans la boucle while :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while read d reste; do d=${d//[][]/}; echo "[$(date -d @"$d")] $reste"; done <fic.in >fic.out
    et c'est tout.
    Juste comme ça, ici, le echo est inutile, autant utiliser date pour le faire:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    while IFS=']' read d reste ; do date -d @"${d//[][]/}" +"[%c] ${reste//%/%%}"; done <fic.in >fic.out

  11. #11
    Expert confirmé Avatar de Flodelarab
    Homme Profil pro
    Inscrit en
    Septembre 2005
    Messages
    5 287
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Charente (Poitou Charente)

    Informations forums :
    Inscription : Septembre 2005
    Messages : 5 287
    Par défaut
    Oui. Tu as bien raison.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sed 's/\[ *\([0-9.]\+\) *\]\(.*\)/date -d @"\1" +"[ %c ]\2"/e'

  12. #12
    Expert confirmé Avatar de disedorgue
    Homme Profil pro
    Ingénieur intégration
    Inscrit en
    Décembre 2012
    Messages
    4 341
    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 341
    Par défaut
    Faudrait juste que tu protèges les possibles % qu'il pourrait y avoir dans le log (voir le traitement que je fais sur la variable reste )

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

Discussions similaires

  1. Remplacer une ligne dans un fichier texte en java
    Par nevrhappen dans le forum Débuter avec Java
    Réponses: 2
    Dernier message: 23/04/2020, 19h55
  2. Remplacer une ligne dans un fichier texte !
    Par toulouz1 dans le forum VBScript
    Réponses: 23
    Dernier message: 19/07/2017, 10h26
  3. Chercher et remplacer une chaine dans un fichier texte C
    Par étoile de mer dans le forum Débuter
    Réponses: 6
    Dernier message: 14/11/2011, 11h59
  4. [Débutant] extraire un caractère d'une colonne dans un fichier texte
    Par 6iluvatar9 dans le forum MATLAB
    Réponses: 2
    Dernier message: 03/11/2010, 14h48
  5. Ecrire une colonne dans un fichier texte
    Par neutrino314 dans le forum VBA Access
    Réponses: 3
    Dernier message: 29/09/2009, 08h31

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