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.