Aquí está el formato de fecha en un montón de archivos que tengo
$cat ./file.log 20220405T130001 message1 20220405T130002 message2 20220405T130003 message3 20220405T130004 message4 20220405T130005 message5Puedo convertirlo a un formato de fecha utilizable haciendo esto:
$cat ./file.log | sed 's/^\(.\{4\}\)/\1-/' | sed 's/^\(.\{7\}\)/\1-/' | sed 's/\(.\{10\}\)./\1 /' | sed 's/^\(.\{13\}\)/\1:/' | sed 's/^\(.\{16\}\)/\1:/ 2022-04-05 13:00:01 message1 2022-04-05 13:00:02 message2 2022-04-05 13:00:03 message3 2022-04-05 13:00:04 message4 2022-04-05 13:00:05 message5Esto parece muy ineficiente. ¿Hay una manera más fácil/mejor de lograr esto en bash?
Las reglas a cambiar serían las siguientes
- después de los primeros 4 caracteres- después de los siguientes 2 caracteres después de la regla anterior- después de los siguientes 2 caracteres después de la regla anteriorT con después de los siguientes 2 caracteres después de la regla anterior: después de los siguientes 2 caracteres después de la regla anterior: después de los siguientes 2 caracteres después de la regla anteriorSuponiendo que siempre obtenga el mismo formato en el archivo de entrada, un solo sed puede manejar esto con múltiples grupos de captura:
sed -E 's/^(.{4})(..)(..)T(..)(..)/\1-\2-\3 \4:\5:/' file 2022-04-05 13:00:01 message1 2022-04-05 13:00:02 message2 2022-04-05 13:00:03 message3 2022-04-05 13:00:04 message4 2022-04-05 13:00:05 message5Con sus muestras mostradas, intente seguir el código awk . La explicación simple sería establecer el separador de campo como espacios T OR. En el programa principal, imprima cadenas secundarias (usando la función substr de awk ) donde imprima las respectivas cadenas secundarias usando los campos 1, 2 y 3 según la salida requerida.
awk -F'T| ' ' { print substr($1,1,4)"-"substr($1,5,2)"-"substr($1,7,2),substr($2,1,2)":"substr($2,3,2)":"substr($2,5,2),$3 } ' Input_file