Comment convertir les horodatages d'une colonne en date?


15

J'ai un fichier contenant ceci:

1415602803,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
1415602807,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
1415602811,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
1415602815,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Je souhaite convertir l'horodatage en une date dans ce format:

2014-11-10 02:00:03,LOGIN SUCCESS,AUTH,user2,192.168.203.63,10.146.124.73,59996,22
2014-11-10 02:00:07,LOGIN SUCCESS,AUTH,user1,172.24.31.10,172.32.1.1,48191,22
2014-11-10 02:00:11,LOGIN FAILED,AUTH,root,172.24.166.153,10.146.124.73,52506,22
2014-11-10 02:00:15,LOGIN FAILED,AUTH,user3,192.168.123.55,10.146.32.99,55750,22

Comment puis je faire ça?

Je sais que cela fonctionne: perl -pe 's/(\d+)/localtime($1)/e'(à partir de cette question ) mais le format de sortie est Mon Nov 10 02:00:03 2014.

Je sais que cette commande peut convertir les horodatages en ma sortie souhaitée:, date -d@1415602803 +"%F %H:%M:%S"mais je ne pouvais pas la faire fonctionner avec l' awkaide system("cmd")de toutes les citations et ainsi de suite.

Réponses:


6

Comme ça peut-être

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 

17

J'ai trouvé quelque chose ici: Stackoverflow - Convertir depuis unixtime sur la ligne de commande .

Entré avec ceci:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","d'utiliser un séparateur de champ de ,,
  • OFS=",";de sorte que les champs de sortie sont également séparés par un ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);pour changer la valeur du premier champ $1dans le format spécifié, et
  • print $0; pour imprimer toute la ligne.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'donne awk: line 2: function strftime never definedici. Veuillez préciser que PAS CHAQUE AWK n'en a strftime()! Pour une solution fonctionnant dans la plupart (tous?) Des AWK, veuillez utiliser la datecommande externe pour rester portable.

2
@yeti, il existe quelques dateimplémentations qui peuvent convertir des dates entre des formats en tant qu'extension, mais la façon dont cela se fait varie complètement entre les implémentations. Par exemple, la solution proposée par Costas utilise une syntaxe spécifique à GNU date. Si vous voulez la portabilité, utilisez perl.
Stéphane Chazelas

4

Si vous le souhaitez, awkvous pouvez utiliser une commande externe dateavec n'importe quel format de date

awk -F, -v OFS="," '{("date +%F\ %T -d @"$1)|getline $1}1'

+1 pour NE PAS utiliser strftime()!

4
Notez que l'utilisation d'une commande externe entraînera une grave baisse des performances, surtout si plusieurs milliers de lignes sont traitées
Jose Gómez

2

Vous pouvez également essayer:

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

2

Il y a 9 mois, j'ai posé une question qui était marquée d'un double de celle-ci. Je viens tout juste de voir une demande d'afficher la réponse qui a fonctionné pour moi sur cette question. Voici un lien vers cette question et réponse.

/unix//a/304009/172916

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.