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.


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

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.


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

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
    

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.

Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.