Abra um arquivo de texto em um terminal e atualize-o automaticamente sempre que for alterado

15

Como abro um arquivo de texto em um terminal com atualização automática instantânea toda vez que ele é alterado?

Eu olhei vimcom :set autoread, mas requer alguma entrada elementar (como um pressionamento de tecla por dentro vim) para acionar a atualização.

Quero que a atualização automática seja sem as mãos. Existe algum truque para fazer isso?

Estou usando o Crunchbang 11, mas estou bastante confortável com o terminal.

Kit
fonte
Para que serve isso? Sobre o que é esse arquivo? Se for um log, geralmente ele adiciona novas linhas na parte inferior, então você pode simplesmente usar tail -f $file.
jirib
Especificamente, estou escrevendo um script Python que grava outro arquivo de texto, não apenas adiciona novas linhas na parte inferior. Eu gostaria de monitorar esse arquivo de texto.
Kit
inotify .......?
jirib
Eu não estou familiarizado inotify. Olhando para cima, é uma API que eu preciso acessar com programação C, que não estou inclinado a fazer tão cedo. Estou procurando uma solução de comando shell.
Kit
1
Há um conjunto de ferramentas que você pode usar na linha de comando chamada, normalmente inotify-tools,. Eles usam um recurso embutido no Kernel chamado inotify. Sempre que um arquivo é acionado sobre um evento é enviado via inotify em que você pode atuar. Muitos prog. langs. como Python, Perl, etc. têm bibliotecas que envolvem a API Inotify. Veja a Wikipedia pg: en.wikipedia.org/wiki/Inotify
slm

Respostas:

25

Isso deve mostrar o arquivo uma vez por segundo:

watch -n 1 cat file
Cristian Măgherușan-Stanciu
fonte
1
É isso que estou procurando. Obrigado! Eu a estendi ainda mais comwatch -tpcn 1 pygmentize -g filename
Kit
@Kit cuidado com watch -g, ele não funciona como você esperaria .
terdon
@terdon, a -gmudança é realmente para pygmentize. De qualquer forma, obrigado pelo aviso.
Kit
Se o conteúdo do arquivo tiver mais de uma página, usando isso, você não poderá rolar a tela para verificar o restante do conteúdo do arquivo.
CodyChan
1
Por que não apenas watch -n 1 tail file?
Varun
7
tail -f /var/log/syslog

Mostra as atualizações do syslog à medida que são adicionadas ao arquivo.

Joe C.
fonte
Isso mostra as linhas à medida que são adicionadas, corretas? O OP precisa de uma atualização completa.
Sean256
funciona em janelas com git-bash também
David
3

Eu usaria watchcomo a outra resposta sugere, mas apenas para mostrar como é possível abordar um problema aparentemente complicado usando os blocos de construção fornecidos por um shell como o Unix; um loop while pode ser uma maneira simples de executar seu loop.

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

Exemplo

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

A tela limpa e, depois de um segundo, isso é exibido:

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

Conforme sugerido nos comentários, você também pode usar, inotifyembora seja um exagero. De longe, o mais simples é usar watch. Aqui está uma maneira de fazer isso inotify:

  1. Instale o inotify-toolspacote

    sudo apt-get install inotify-tools
    
  2. Use inotifywatchpara verificar se há alterações no seu arquivo. Execute-o em um loop e cato arquivo se uma alteração for detectada (é por isso que eu greppara a string total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    
terdon
fonte
Passando -q(ou --quiet) para grepsilenciar a linha correspondente com "total".
FichteFoll 25/02
@FichteFoll bom ponto (por favor, desconsidere meu comentário anterior, se você o viu antes de excluir, eu estava sendo lento). Obrigado, editado.
terdon
0

watch(1)é uma ferramenta realmente útil. [1]

Eu não recomendaria usar catembora.

Em vez disso, use headou tailpara saber se você precisa ver o início ou o final do arquivo.

ScrewTSW
fonte