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.

Alaa Ali
la source

Réponses:

6

Comme ça peut-être

perl -pe 'use POSIX qw(strftime); s/^(\d+)/strftime "%F %H:%M:%S", localtime($1)/e' 
Marki
la source
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.
Alaa Ali
la source
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'
Costas
la source
+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
kayn
la source
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

Emily Shaffer
la source