¿Cómo puedo convertir marcas de tiempo en una columna a una fecha?


15

Tengo un archivo que contiene esto:

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

Quiero convertir la marca de tiempo a una fecha en este formato:

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

¿Cómo puedo hacer eso?

Sé que esto funciona: perl -pe 's/(\d+)/localtime($1)/e'(de esta pregunta ) pero el formato de salida es Mon Nov 10 02:00:03 2014.

Sé que este comando se puede convertir marcas de tiempo en mi salida deseada: date -d@1415602803 +"%F %H:%M:%S", pero no pude hacer que funcione con awkel uso system("cmd")debido a todas las citas y otras cosas.

Respuestas:


6

Como esto quizás

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

17

Encontré algo aquí: Stackoverflow - Convertir de unixtime en la línea de comando .

Se le ocurrió esto:

awk -F"," '{OFS=","; $1=strftime("%Y-%m-%d %H:%M:%S", $1); print $0}' file
  • -F","para usar un separador de campo de ,,
  • OFS=",";para que los campos de salida también estén separados por a ,,
  • $1=strftime("%Y-%m-%d %H:%M:%S", $1);para cambiar el valor del primer campo $1al formato especificado, y
  • print $0; para imprimir toda la línea.

2
awk 'BEGIN{ print strftime("%Y-%m-%d %H:%M:%S", 0) }'da awk: line 2: function strftime never definedaquí. ¡Por favor aclare que NO TODO AWK tiene strftime()! Para una solución que se ejecute en la mayoría de los AWK (¿todos?), Utilice el datecomando externo para mantenerse portátil.

2
@yeti, hay algunas dateimplementaciones que pueden convertir fechas entre formatos como una extensión, pero la forma en que se realiza varía completamente entre las implementaciones. Por ejemplo, la solución dada por Costas usa una sintaxis específica de GNU date. Si quieres portabilidad, úsala perl.
Stéphane Chazelas

4

Si lo desea awk, puede usar comandos externos datecon cualquier formato de fecha

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

¡+1 por NO usar strftime()!

44
Tenga en cuenta que el uso de un comando externo incurrirá en un golpe de rendimiento severo, especialmente notable si se procesan miles de filas
Jose Gómez

2

También puedes probar:

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

2

Hice una pregunta hace 9 meses que estaba marcada como un duplicado de esta. Acabo de ver una solicitud para publicar la respuesta que funcionó para mí en esta pregunta. Aquí hay un enlace a esa pregunta y respuesta.

/unix//a/304009/172916

Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.