Abra un archivo de texto en una terminal y actualícelo automáticamente cada vez que se cambie

15

¿Cómo abro un archivo de texto en una terminal con actualización automática instantánea cada vez que se cambia?

He examinado vimcon :set autoread, pero requiere una entrada elemental (como presionar una tecla en el interior vim) para activar la actualización.

Quiero que la actualización automática sea manos libres. ¿Hay algún truco para hacer esto?

Estoy usando Crunchbang 11, pero estoy bastante cómodo con el terminal.

Equipo
fuente
¿Para qué sirve eso? ¿De qué trata este archivo? Si es un registro, generalmente tiene nuevas líneas agregadas en la parte inferior, entonces simplemente podría usar tail -f $file.
jirib
Específicamente, estoy escribiendo un script de Python que escribe otro archivo de texto, no solo agrega nuevas líneas en la parte inferior. Me gustaría monitorear ese archivo de texto.
Kit
inotify .......?
jirib
No estoy familiarizado con inotify. Al buscarlo, es una API a la que necesito acceder con la programación en C, que no estoy dispuesto a hacer pronto. Estoy buscando una solución de comando de shell.
Kit
1
Hay un conjunto de herramientas que puede utilizar desde la línea de comandos llamada, por lo general, inotify-tools. Estos usan una característica integrada en el Kernel llamada inotify. Cada vez que se actúa un archivo sobre un evento se envía a través de inotify en el que puede actuar. Muchos prog. langs. como Python, Perl, etc. tienen bibliotecas que envuelven la API de Inotify. Consulte la página de Wikipedia: en.wikipedia.org/wiki/Inotify
slm

Respuestas:

27

Esto debería mostrarle el archivo una vez por segundo:

watch -n 1 cat file
Cristian Măgherușan-Stanciu
fuente
1
Esto es lo que estoy buscando. ¡Gracias! Lo extendí aún más conwatch -tpcn 1 pygmentize -g filename
Kit
@ Kit con cuidado watch -g, no funciona como cabría esperar .
terdon
@terdon, el -gcambio es en realidad para pygmentize. De todos modos, gracias por la advertencia.
Kit
Si el contenido del archivo está sobre una página, con esto, no puede desplazarse por la pantalla para verificar el resto del contenido del archivo.
CodyChan
1
¿Por qué no solo watch -n 1 tail file?
Varun
8
tail -f /var/log/syslog

Muestra las actualizaciones de syslog a medida que se agregan al archivo.

Joe C.
fuente
Esto muestra líneas a medida que se agregan ¿correcto? OP necesita una actualización completa.
Sean256
también funciona en windows con git-bash
David
3

Lo usaría watchcomo sugiere la otra respuesta, pero solo para mostrarle cómo uno puede abordar un problema aparentemente complicado usando los bloques de construcción proporcionados por un shell como Unix; Un bucle while puede ser una forma sencilla de realizar su bucle.

$ while [ 1 ]; do clear; date; cat <afile>; sleep 1 ;done

Ejemplo

$ while [ 1 ]; do clear; date; cat sample.txt; sleep 1 ;done
Fri Nov 15 09:17:39 EST 2013
1
2
3
4
5

La pantalla se borra y luego, después de un segundo, se muestra esto:

Fri Nov 15 09:17:40 EST 2013
1
2
3
4
5
slm
fuente
2

Como se sugiere en los comentarios, también podría usarlo inotifyaunque sea excesivo. Por mucho, lo más simple es usarlo watch. Aquí hay una forma de hacerlo inotify:

  1. Instala el inotify-toolspaquete

    sudo apt-get install inotify-tools
    
  2. Utilícelo inotifywatchpara verificar su archivo en busca de cambios. Ejecútelo en un bucle y catel archivo si se detecta un cambio (es por eso que yo greppara la cadena total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    
terdon
fuente
Pasar -q(o --quiet) a grepsilenciará la línea coincidente con "total".
FichteFoll
Buen punto de @FichteFoll (ignore mi comentario anterior si lo vio antes de eliminarlo, estaba siendo lento). Gracias, editado.
terdon
0

watch(1)Es una herramienta realmente útil. [1]

Sin embargo, no recomendaría usar cat.

En su lugar, use heado tailpara saber si necesita ver el principio o el final del archivo.

ScrewsTSW
fuente