Apri un file di testo in un terminale e aggiornalo automaticamente ogni volta che viene modificato


15

Come faccio ad aprire un file di testo in un terminale con aggiornamento automatico istantaneo ogni volta che viene modificato?

Ho osservato vimcon :set autoread, ma richiede alcuni input elementari (come una pressione dei tasti all'interno vim) per attivare l'aggiornamento.

Voglio che l'aggiornamento automatico sia a mani libere. C'è qualche trucco per farlo?

Sto usando Crunchbang 11, ma mi sento abbastanza a mio agio con il terminale.


A cosa serve? Di cosa tratta questo file? Se è un registro, di solito ha nuove righe aggiunte in fondo, quindi potresti semplicemente usare tail -f $file.
jirib,

In particolare, sto scrivendo uno script Python che scrive un altro file di testo, non solo aggiungo nuove righe in fondo. Vorrei monitorare quel file di testo.
Kit

inotify .......?
jirib,

Non ho familiarità inotify. Guardandolo in su, è un'API alla quale devo accedere con la programmazione in C, che non sono propenso a fare presto. Sto cercando una soluzione di comando di shell.
Kit

1
V'è una suite di strumenti che è possibile utilizzare dalla riga di comando chiamato, in genere, inotify-tools. Questi usano una funzionalità integrata nel kernel chiamata inotify. Ogni volta che un file viene eseguito su un evento viene inviato tramite inotify su cui è possibile agire. Molti prog. langs. come Python, Perl, ecc. hanno librerie che racchiudono l'API di Inotify. Vedi la pagina di Wikipedia: en.wikipedia.org/wiki/Inotify
slm

Risposte:


27

Questo dovrebbe mostrare il file una volta al secondo:

watch -n 1 cat file

1
Questo è quello che sto cercando. Grazie! L'ho esteso ulteriormente conwatch -tpcn 1 pygmentize -g filename
Kit

@Kit attento con watch -g, non funziona come ti aspetteresti .
terdon

@terdon, l' -ginterruttore è effettivamente per pygmentize. Comunque, grazie per l'avvertimento.
Kit

Se il contenuto del file è su una pagina, usando questo, non è possibile scorrere lo schermo per controllare il resto del contenuto del file.
CodyChan,

1
Perché non solo watch -n 1 tail file?
Varun,

8
tail -f /var/log/syslog

Mostra gli aggiornamenti di syslog man mano che vengono aggiunti al file.


Questo mostra le righe come vengono aggiunte correttamente? L'OP ha bisogno di un aggiornamento completo.
Sean256,

funziona anche su windows con git-bash
David

3

Vorrei usare watchcome suggerisce l'altra risposta, ma solo per mostrarti come si può affrontare un problema apparentemente complicato usando i mattoni forniti da una shell come Unix; un ciclo while può essere un modo semplice per eseguire il ciclo.

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

Esempio

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

Lo schermo si cancella e dopo un secondo viene visualizzato:

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

2

Come suggerito nei commenti, è possibile utilizzare inotifyanche se è eccessivo. Di gran lunga il più semplice è usare watch. Ecco un modo per farlo con inotify:

  1. Installa il inotify-toolspacchetto

    sudo apt-get install inotify-tools
    
  2. Utilizzare inotifywatchper verificare la presenza di modifiche nel file. Eseguilo in un ciclo e catil file se viene rilevata una modifica (ecco perché I grepper la stringa total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    

Il passaggio -q(o --quiet) a grepsilenzia la linea abbinata con "totale".
FichteFoll,

@FichteFoll buon punto (per favore ignora il mio commento precedente se l'hai visto prima che lo cancellassi, ero lento). Grazie, a cura.
terdon

0

watch(1)è uno strumento davvero utile. [1]

Non consiglierei di usare catperò.

Al contrario, utilizzare heado tailper visualizzare l'inizio o la fine del file.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.