Al hacer una tail -f error.log, ¿cómo insertar programáticamente un salto de línea después de que no se haya agregado nada al archivo durante 3 segundos?
(obviamente, una vez que se ha agregado un salto de línea, no se debe agregar ningún otro salto de línea hasta que se agreguen otras líneas de texto al archivo de registro)
Por ejemplo, estas líneas se agregan a error.log:
foo
bar
boo [[wait 4 seconds]]
2far
2foo
2bar
2boo [[wait 40 seconds]]
2far
Este sería el resultado en la consola:
foo
bar
boo
2far
2foo
2bar
2boo
2far
shell-script
text-processing
tail
Cedric
fuente
fuente

tspara agregar marcas de tiempo a la salida y procesar las marcas de tiempoRespuestas:
Siempre puede implementar el
tail -f(bueno aquí, a menos que descomente elseek(), más comotail -n +1 -fcuando estamos volcando todo el archivo) a mano con,perlpor ejemplo:O deje
tail -fque se sigan y utiliceperlpara insertar las nuevas líneas si no hay entrada durante 3 segundos:Aquellos suponen que la salida en sí no se ralentiza (como cuando la salida va a una tubería que no se lee activamente).
fuente
bash+datesolución:fuente
$SECONDSpara contar intervalos de tiempo. Creo que es la cantidad de segundos desde que se inició el shell, no es importante cuando se toma la diferencia.read -to$TMOUT.$SECONDSestá rotobashymksh.time bash -c 'while ((SECONDS < 3)); do :; done'durará entre 2 y 3 segundos. Mejor usar zsh o ksh93 en su lugar aquí (contypeset -F SECONDS)date +%s. Ambos dan el tiempo en segundos completos, lo que tiene el efecto de que el intervalo de, por ejemplo, 1.9 a 4.0 parece 3 segundos completos, aunque en realidad es 2.1. Es difícil evitar eso si no puedes acceder a los segundos fraccionarios. Pero sí, probablemente deberían dormir aquí en lugar de estar ocupados, y luegoread -tpodrían ser utilizados. Incluso si duermes manualmente,time bash -c 'while [[ $SECONDS -lt 3 ]]; do sleep 1; done'funciona bien.SECONDS=0asegura que$SECONDSalcanzará 1 en exactamente 1 segundo. Ese no es el caso,bashya que utilizatime()para rastrear en$SECONDSlugar degettimeofday(). Informé de errores a mksh, zsh y bash hace algún tiempo, solo se solucionó zsh. (Buen punto sobre que el problema es el mismo condate +%s). Tenga en cuenta que no es un loop ocupado aquí, ya que estamos leyendo de la salida detail -fmás de una tubería.printfemulardatesin necesidad de herramientas externas o sustitución de comandos:printf -v t '%(%s)T' -1.Pythonsolución (con argumento dinámico de intervalo de tiempo ):tailing_by_time.pyguión:Uso:
fuente