2012-09-05 12 views
5

Centos/Linux Bashsed: masa convertir entre épocas al azar otro texto

Tengo un archivo de registro, que tiene gran cantidad de texto y números en época por todo el lugar. Quiero reemplazar todas las épocas donde sea que estén en una fecha/hora legible.

He estado queriendo esto vía sed, ya que parece ser la herramienta para el trabajo. Parece que no puedo obtener la parte de reemplazo de sed para analizar realmente la variable (época) para la conversión.

muestra de lo que estoy trabajando ...

echo "Some stuff 1346474454 And not working" \ 
| sed 's/1[0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9][0-9]/'"`bpdbm -ctime \&`"'/g' 
Some stuff 0 = Thu Jan 1 01:00:00 1970 And not working 

La parte bpdbm ​​convertirá una variable época suministrado en la fecha útil. Así ...

bpdbm -ctime 1346474454 
1346474454 = Sat Sep 1 05:40:54 2012 

Entonces, ¿cómo puedo obtener el elemento "encontrado" para analizar en un comando. Como parece que no puedo hacer que funcione.

Cualquier ayuda sería encantadora. Si hay otra manera, sería genial ... pero sospecho que sed será más rápido.

¡Gracias por su tiempo!

+0

ejecutar esto con 'set -vx' para ver por qué no está funcionando.Sed tiene que procesar la línea de datos antes de que "conozca" el valor de '&', la sustitución de cmd tendría que retrasarse hasta el último punto, pero es probable que lo primero que se procese. Puedes hacer esto fácilmente en awk. Tu fe en Sed es conmovedora ;-). ¡Buena suerte! – shellter

+0

Bueno, sí ... me gusta intentar y mantener sed y awk donde sea posible. Tendré otro juego con Sed mañana, no me he dado por vencido en una resolución basada en sed – user1649704

Respuesta

7

que parece la herramienta para el trabajo

No, no lo es. sed solo puede usar &, no hay forma de que sea un argumento para un comando. Necesitas algo más poderoso, p. Perl:

perl -pe 'if (($t) = /(1[0-9]+)/) { s/$t/localtime($t)/e }' 
+0

Eso funciona maravilloso, ¡¡¡gracias !! – user1649704

+0

Eso funcionó perfectamente para mí para analizar XML que tenía un tiempo de época en legible para humanos: 'cat inputfile.xml | perl -pe 'if (($ t) =/(1 [0-9] +) /) {s/$ t/localtime ($ t)/e}'> outputfile.xml' – zedix

1

Usted puede hacerlo con sed de GNU, la entrada:

archivoentrada

Some stuff 1346474454 And not working 

sed de GNU apoya /e parámetro que permite la salida del comando de tuberías en el espacio patrón, uno forma de aprovechar esto con bpdbm:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(bpdbm -ctime \2) \3/e' infile 

O con coreutilsdate:

sed 's/(.*)(1[0-9]{9})(.*)/echo \1 $(date -d @\2) \3/e' infile 

salida con fecha

Some stuff Sat Sep 1 06:40:54 CEST 2012 And not working 

Para obtener el mismo resultado que con bpdbm:

sed 's/(.*)(1[0-9]{9})(.*)/echo "\1$(date -d @\2 +\"%a %b %_d %T %Y\")\3"/e' infile 

salida

Some stuff Sat Sep 1 06:40:54 2012 And not working 

Nota, esto solo reemplaza la última época encontrada en una línea. Vuelva a ejecutar si hay más.