Convertir / remplacer le temps de l'époque millisecondes en date lisible par l'homme dans les fichiers journaux

Dec 05 2020

J'ai un fichier journal avec la structure suivante

Exemple:

1522693524403 entity1,sometext
1522693541466 entity2,sometext
1522693547273 entity1,sometext
...

Maintenant, je voudrais remplacer l'heure de l'époque millisecondes par DD.MM.YYYY HH: MM: SS dans tous les fichiers journaux par une commande bash sur un système Debian.

J'ai essayé différentes solutions proposées ici et sur d'autres sites Web, mais cela n'a pas vraiment fonctionné pour moi.

Quelqu'un peut-il m'aider s'il-vous-plaît?

À votre santé

démarrage rapide

Réponses

4 thanasisp Dec 05 2020 at 22:13

Si vous utilisez un script shell lisant ligne par ligne, ou un awksystème d'appel de script date, ce serait très lent, trop de processus. Vous devez utiliser un simple script awk, Perl, Python ou autre. Toutes les langues ont des fonctions datetime standard pour les conversions entre les formats.

Voici et voici quelques bonnes références. Si vous souhaitez utiliser les awk fonctions de temps GNU et strftime(), tout ce dont vous avez besoin pour votre cas est de sélectionner la sous-chaîne d'époque en excluant les millisecondes:

$ awk '{$1 = strftime("%F %T", substr($1,1,10))} 1' file
2018-04-02 21:25:24 entity1,sometext
2018-04-02 21:25:41 entity2,sometext
2018-04-02 21:25:47 entity1,sometext

Ou pour imprimer les millisecondes ensemble:

$ awk '{$1 = strftime("%F %T", substr($1,1,10)) "." substr($1,11)} 1' file
2018-04-02 21:25:24.403 entity1,sometext
2018-04-02 21:25:41.466 entity2,sometext
2018-04-02 21:25:47.273 entity1,sometext

Ou pour imprimer le format jour-mois-année:

$ awk '{$1 = strftime("%d-%m-%Y %T", substr($1,1,10))} 1' file
02-04-2018 21:25:24 entity1,sometext
02-04-2018 21:25:41 entity2,sometext
02-04-2018 21:25:47 entity1,sometext
2 terdon Dec 05 2020 at 22:14

Ce n'est pas quelque chose que vous pouvez faire avec une commande bash, vous avez besoin d'un programme externe car bash ne peut pas faire de calcul en virgule flottante et ne peut pas gérer les dates. Je suppose que vous vouliez simplement dire "sur la ligne de commande", et vous n'avez pas réellement besoin d'une solution pure bash. Avec cette hypothèse, voici une gawksolution (GNU awk):

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:24 entity1,sometext
02.04.2018 19:04:41 entity2,sometext
02.04.2018 19:04:47 entity1,sometext

La strftimefonction convertit l'horodatage en date. Puisque le vôtre est en millisecondes, nous utilisons sprintfpour convertir cela en secondes. Le final 1;dit simplement gawkd'imprimer la ligne après que nous ayons attribué la nouvelle valeur à $1(le premier champ).


N'oubliez pas que la sortie dépendra de votre fuseau horaire. Par exemple, ce qui précède a été exécuté sur une machine réglée sur le fuseau horaire GMT. C'est pourquoi mes chiffres sont différents de ceux de la réponse de @ thanasisp qui a probablement été exécutée sur un fuseau horaire différent. Vous pouvez contrôler cela et modifier la sortie en définissant la TZvariable lors de l'exécution de la commande. Par exemple, comparez ceci:

$ gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 19:04:02.24 entity1,sometext
02.04.2018 19:04:02.41 entity2,sometext
02.04.2018 19:04:02.47 entity1,sometext

pour ça:

$ TZ=America/Los_Angeles gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
02.04.2018 11:04:02.24 entity1,sometext
02.04.2018 11:04:02.41 entity2,sometext
02.04.2018 11:04:02.47 entity1,sometext

Ou ca:

$ TZ=Asia/Tokyo gawk '{$1=strftime("%d.%m.%Y %H:%m:%d.%S",sprintf("%.3f", $1 /1000))}1;' file
03.04.2018 03:04:03.24 entity1,sometext
03.04.2018 03:04:03.41 entity2,sometext
03.04.2018 03:04:03.47 entity1,sometext