
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 -f
este archivo y canalizar los resultados al jq
comando, pero necesito eliminar 2021-06-15T22:50:11+00:00 DEBUG
una parte antes de canalizarlo, jq
ya que jq
se 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 sed
que puede generar resultados sin búfer:
tail -f file | sed -u 's/^[^{]*//' | jq .
Esto se ejecutará tail -f
en su archivo y enviará continuamente nuevos datos a sed
. El sed
comando eliminaría todo hasta el espacio antes del primero {
en la línea y luego enviaría el resultado a jq
.
La -u
opción de GNU sed
hace que no almacene en búfer la salida. Sin esta opción, sed
el resultado se almacenaría en el buffer y solo se enviarían datos jq
una 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 DEBUG
cadena 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 sed
comando 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 DEBUG
cadena 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 cut
para realizar un almacenamiento en búfer de salida basado en líneas en lugar de en bloques).