Existe uma versão de paginação do `watch`?

24

Sob um shell UNIX, como posso obter um efeito semelhante ao watchcomando, mas com paginação para que eu possa rolar pela saída se ela ocupar mais de uma tela?

Em outras palavras, eu quero um programa que é o watchque lessé necessário cat.

Como exemplo, digamos que eu queria assistir a saída de qstat, eu poderia usar

watch qstat

para assistir a saída do qstat, mas isso só mostra a primeira tela.

Com uma versão de paginação de watch, eu seria capaz de me mover na saída, pois ela ainda é continuamente atualizada por watch. Existe alguma maneira de fazer isso no momento com os utilitários existentes?

David Dean
fonte
Provavelmente isso pertence ao SuperUser ou talvez ServerFault.
Você provavelmente está certo, como posso movê-lo?
David Dean
Três pessoas votaram para avançar até agora; se mais duas pessoas (ou um moderador) votarem para movê-lo, isso acontecerá automaticamente.
Greg Hewgill
Por que não abrir uma janela maior e deixar a paginação completamente?
Marcin
1
porque minha tela já está cheia? por que usar lessquando você pode simplesmente usar cate uma janela maior?
7269 David Dean

Respostas:

18

Em vez de modificar o comando 'watch', use screen!

Por exemplo, digamos que você precise ver 300 linhas de altura e 100 caracteres de largura e mover-se em torno disso. Após a tela inicial, force o tamanho da seguinte maneira:

C-a :height -w 300
C-a :width -w 100

Agora inicie o seu comando watch. Você pode usar C-a <ESC>a página ao redor da tela.

Infelizmente, a exibição não é atualizada no modo de cópia. Mas se você deseja ajustar a seção da janela que está visualizando, a maneira mais fácil pode ser executar novamente os comandos de altura / largura, pois, por padrão, seu terminal mostra o canto inferior direito da janela virtual.

MikeyB
fonte
O único problema, então, é como repetir continuamente o comando, enquanto limpar o ecrã entre cada movimento
David Dean
Opa, eu quis dizer executar o comando watch dentro da tela. Fixo.
MikeyB
yartls - ainda uma outra razão para a tela amor :)
Warren
nota que C-é akactrl-
henry
5

Você pode tentar isso:

enquanto vmstat; dorme 1; feito | Menos

substitua o vmstat pelo qstat e ajuste o sono às suas necessidades

Spacen Jasset
fonte
tudo o que isso faz é repetir o comando less, o que significa que você precisa continuar rolando para ver a saída mais recente.
21715 David Dean
Sim, mas você pode voltar. Você não pode ter os dois ao mesmo tempo. Pressionar a tecla f, que é capital 'F', funcionará como uma cauda.
Spacen Jasset
2

OK, eu tive um pouco de ir a uma watchlessfunção. É um pouco difícil, e ainda não parece funcionar completamente, mas aqui vai:

#!/bin/bash -u
out=$(mktemp)
(while [ 1 ]; do
    "$@" > $out;
    sleep 2;
done) &
less $out
kill $!

Você precisa usar manualmente a Rtecla menos para obter a atualização do visor.

Parece funcionar para watchless datemas não para watchless qstatou watchless pstree, os quais são mostrados em branco. Alguma ideia?

David Dean
fonte
Você deve usar um segundo arquivo para gravar a saída da próxima execução do comando e, em seguida, mvesse segundo arquivo no arquivo lido lesscomo mvatômico. Caso contrário, lesspoderia pensar que o arquivo desapareceu se uma atualização for solicitada ao mesmo tempo em que o arquivo está sendo gravado "$@" > $out. Você também deve gravar no arquivo de saída uma vez antes de iniciar o loop.
Aurélien Ooms
0

Não vejo como isso pode ser implementado à medida que o conteúdo da linha é alterado e watchredefiniria a primeira linha a cada 2 segundos, mesmo que você pudesse rolar para baixo.

Algumas soluções alternativas são:

watch 'qstat | tail -n40' para mostrar a saída do qstat começando na 40ª linha da parte inferior

watch 'qstat | grep jsmith' grep a saída para que as linhas de seu interesse estejam sempre na primeira tela.

Observe que você precisa colocar os comandos ao redor do pipe entre aspas simples - caso contrário, você canalizará a saída de watch, e não a saída de qstat.

enkrs
fonte
0

Para continuar na resposta de enkrs,

assistir 'qstat | cabeça -300 | cauda -15 '

você receberá páginas arbitrárias na saída do qstat.


fonte
0

Aqui está um script bastante bruto que parece funcionar para vários comandos que eu joguei nele

#!/bin/bash
# ---- mywatch.sh ----

if [ $# -lt 1 && $# -gt 2 ]; then
    echo "Usage: $0 <command> <delay>" 
    exit 1
fi

CMD=$1
if [ $# -eq 2 ]; then
  DELAY=$2
else
  DELAY=2 # default
fi

while : ; do
  ( (echo -e "Every ${DELAY}s: $CMD\n"; $CMD) | less )&
  PID=$!
  sleep $DELAY
  kill -9 $PID &> /dev/null
  clear
done

Usado como tal:

alias mywatch="~/bin/mywatch.sh"

mywatch vmstat
mywatch "ps aux" # commands in options need to be quoted
mywaych pstree 10 # change delays

Sendo bastante pedante, a transição entre as atualizações não é tão suave quanto eu gostaria que fosse. Naturalmente, por ser um script simples, ele não suporta o destaque do diff (watch-d). Além disso, a análise dos argumentos de entrada pode ser feita melhor.

Shawn Chin
fonte
0

Que tal apenas: tail -f

geeklin
fonte
0

Eu implementei um script python simples para atender a essa solicitação, chamada "watchall"

obtê-lo por: pip install watchall

substitua o relógio por watchall e aproveite a tela rolável. agora ele suporta apenas sinalizadores -n e -d.

Mohammad Fatemipour
fonte
-1

podes tentar:

watch command > file

então, no seu arquivo, você deverá ver a saída em anexo (não tenho uma caixa Linux agora para testar isso)


fonte
1
Isso não vai fazer o que você pretende, na verdade, ele será preenchido filerepetidamente com a mesma saída. Certamente não aborda a questão original.
Greg Hewgill 6/08/09
então eu não sei :)
1
Altere ">" para ">>" para anexar os dados ao arquivo?
Rory