Seguir un archivo y eliminar la fecha y hora

Seguir un archivo y eliminar la fecha y hora

Tengo un archivo de registro que contiene el siguiente contenido.

2021-06-15T22:50:11+00:00 DEBUG {"slug": "something", "key2": "value2"}

Me gustaría enviar tail -feste archivo y canalizar los resultados al jqcomando, pero necesito eliminar 2021-06-15T22:50:11+00:00 DEBUGuna parte antes de canalizarlo, jqya que jqse espera una cadena JSON.

¿Hay alguna manera de seguir el archivo de registro y eliminar la parte de fecha y hora al mismo tiempo?

En última instancia, me gustaría utilizar el siguiente comando.

tail -f :file | jq

Respuesta1

Suponiendo que tiene acceso a GNU sedque puede generar resultados sin búfer:

tail -f file | sed -u 's/^[^{]*//' | jq .

Esto se ejecutará tail -fen su archivo y enviará continuamente nuevos datos a sed. El sedcomando eliminaría todo hasta el espacio antes del primero {en la línea y luego enviaría el resultado a jq.

La -uopción de GNU sedhace que no almacene en búfer la salida. Sin esta opción, sedel resultado se almacenaría en el buffer y solo se enviarían datos jquna vez que el buffer (¿4 Kb?) estuviera lleno. Hacer un almacenamiento en búfer de este tipo es un procedimiento estándar cuando la salida de una herramienta no es el terminal en sí, y se hace por razones de eficiencia. En este caso, es posible que queramos desactivar el almacenamiento en búfer, por lo que usamos -u.

Para seleccionar solo líneas que contengan la DEBUGcadena antes de los datos JSON:

tail -f file | sed -u -e '/^[^{]*DEBUG /!d' -e 's///' | jq .

o

tail -f file | sed -u -n 's/^[^{]*DEBUG //p' | jq .

El sedcomando aquí eliminaría todas las líneas que no comiencen con algún texto que no contenga {caracteres y terminen en DEBUG. Si se encuentra dicha línea, el texto coincidente se elimina, dejando los datos JSON.

Tenga en cuenta que aquí extraemos el JSON en función de la DEBUGcadena en lugar de la {que inicia un objeto JSON.

Relacionado con el almacenamiento en búfer en tuberías:

Respuesta2

Para eliminar las primeras 2 columnas delimitadas por espacios:

tail -f file | stdbuf -oL cut -d ' ' -f3- | jq .

( stdbuf -oL, como se encuentra en los sistemas GNU o FreeBSD, trucos cutpara realizar un almacenamiento en búfer de salida basado en líneas en lugar de en bloques).

información relacionada