3 votes

Convertir un timestamp en datetime avec sed

J'ai un fichier journal, et chaque ligne de celui-ci est comme :

timestamp=1356431101, entity=xxx, event: xxxxxx

Je veux maintenant utiliser sed pour remplacer le timestamp par une date lisible par l'homme :

timestamp=2012-12-24 10:00:00, entity=xxx, event:xxxxx

Mon commandement est :

sed "s/^timestamp=\([0-9]\{10\}\),/timestamp=\`date +%D --date=@\1\`,/"

Mais le problème est que le \1 ne peut pas être remplacé par l'horodatage à 10 chiffres, mais il est toujours traité comme un chiffre. 1 . Quelqu'un peut-il me dire comment aborder ce problème ? Merci d'avance !

4voto

kayn Points 60

Essayez

cat test.txt | sed 's/^/echo "/; s/\([0-9]\{10\}\)/`date -d @\1`/; s/$/"/' | bash

3voto

Guru Points 7050

Awk est meilleur pour ces choses, si c'est acceptable :

awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file

Un exemple de résultat :

$ cat file
timestamp=1356431101, entity=xxx, event: xxxxxx
timestamp=1354770380, entity=xxx, event: xxxxxx

En exécutant la commande :

$ awk -F, '{x=$1;sub(/.*=/,"",$1);sub(/=.*/,strftime("=%Y-%m-%d %H:%M:%S",$1),x);$1=x;}1' OFS=, file
timestamp=2012-12-25 15:55:01, entity=xxx, event: xxxxxx
timestamp=2012-12-06 10:36:20, entity=xxx, event: xxxxxx

Le premier sub extrait l'horodatage. La seconde utilise la commande strftime remplace le timestamp par la date et l'heure. 1 est utilisé pour imprimer chaque ligne.

1voto

Steve Points 18420

La manipulation de l'horodatage est mieux réalisée avec un langage de programmation plus moderne, comme Perl ou Ruby. Cependant, si vous disposez de GNU awk, vous pouvez le faire en utilisant la commande strftime() fonction :

awk '{ sub(/[0-9]{10}/, strftime("%Y-%m-%d %H:%M:%S", substr($0,11,10))) }1' file

Résultats :

timestamp=2012-12-25 20:25:01, entity=xxx, event: xxxxxx

Vous pouvez également en savoir plus sur les fonctions temporelles de GNU awk ici :

http://www.gnu.org/software/gawk/manual/html_node/Time-Functions.html

1voto

William Pursell Points 56211

En fait, je préfère le awk mais, par souci d'exhaustivité, une perl ressemble à une solution :

perl -Mposix -pe 's/([0-9]{10})/POSIX::strftime( "%Y-%m-%d %H:%M:%S", gmtime($1))/eg'

Si vous voulez faire correspondre le premier "timestamp=" pour limiter les remplacements (bien que cela ne semble pas nécessaire étant donné l'exemple d'entrée), vous pouvez utiliser : 's/(?:timestamp=)([0-9]*)/...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X