¿Existe una versión de paginación de `watch`?

24

Bajo un shell de UNIX, ¿cómo puedo obtener un efecto similar al watchcomando, pero con paginación para poder desplazarme en la salida si ocupa más de una pantalla?

En otras palabras, quiero un programa que sea para watchlo que lesses cat.

Como ejemplo, digamos que quería ver la salida de qstat, podría usar

watch qstat

para ver la salida de qstat, pero esto solo puede mostrar la primera pantalla completa.

Con una versión de paginación watch, podría moverme en la salida ya que todavía se actualiza continuamente watch. ¿Hay alguna manera de hacer esto en este momento con las utilidades existentes?

David Dean
fuente
Esto probablemente pertenece a SuperUser o quizás ServerFault.
Probablemente tengas razón, ¿cómo puedo moverlo?
David Dean el
Tres personas han votado para moverlo hasta ahora; Si dos personas más (o un moderador) votan para moverlo, entonces sucederá automáticamente.
Greg Hewgill
¿Por qué no simplemente abrir una ventana más grande y desaparecer por completo?
Marcin
1
porque mi pantalla ya está llena? ¿Por qué usar lesscuando puedes usar caty una ventana más grande?
David Dean el

Respuestas:

18

¡En lugar de modificar el comando 'mirar', use la pantalla!

Por ejemplo, supongamos que necesita poder ver 300 líneas de altura y 100 caracteres de ancho y moverse alrededor de eso. Después de iniciar la pantalla, fuerce el tamaño así:

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

Ahora comience su comando de vigilancia. Luego puede usar C-a <ESC>para desplazarse por la pantalla.

Desafortunadamente, la pantalla no se actualiza mientras está en modo copia. Pero si desea ajustar qué sección de la ventana está viendo, la forma más fácil puede ser volver a ejecutar los comandos de alto / ancho, ya que de forma predeterminada su terminal muestra la esquina inferior derecha de la ventana virtual.

MikeyB
fuente
el único problema entonces es cómo repetir continuamente el comando, mientras se deja la pantalla en blanco entre cada jugada
David Dean
Vaya, me refería a ejecutar el comando watch dentro de la pantalla. Fijo.
MikeyB
yartls - otra razón más para amar la pantalla :)
warren
tenga en cuenta que C-es akactrl-
henry
5

Puedes probar esto:

mientras vmstat; duerme 1; hecho | Menos

reemplace vmstat con qstat y ajuste la suspensión a sus necesidades

Spacen Jasset
fuente
todo lo que hace es seguir repitiendo el comando less, lo que significa que debe seguir desplazándose para ver la última salida.
David Dean el
Sí, pero puedes desplazarte hacia atrás. No puedes tener ambos a la vez. Al presionar shift f, es decir, la 'F' mayúscula funcionará como la cola.
Spacen Jasset
2

OK, he tenido un pequeño paso en una watchlessfunción. Es un poco difícil, y todavía no parece funcionar por completo, pero aquí va:

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

Debe usar la Rtecla manualmente en menos para que la pantalla se actualice.

Parece funcionar para watchless datepero no para watchless qstato watchless pstree, que se muestran en blanco. ¿Algunas ideas?

David Dean
fuente
Debe usar un segundo archivo para escribir la salida de la próxima ejecución del comando y luego mveste segundo archivo en el archivo leído lesscomo mves atómico. De lesslo contrario, podría pensar que el archivo ha desaparecido si se solicita una actualización al mismo tiempo que se está escribiendo el archivo "$@" > $out. También debe escribir una vez en el archivo de salida antes de comenzar el ciclo.
Aurélien Ooms
0

No veo cómo esto podría implementarse a medida que cambia el contenido de la fila, y watchvolvería a la primera línea cada 2 segundos, incluso si pudiera desplazarse hacia abajo.

Algunas soluciones son:

watch 'qstat | tail -n40' para mostrar la salida de qstat comenzando desde la línea 40 desde abajo

watch 'qstat | grep jsmith' para seleccionar la salida de modo que las líneas que le interesan estén siempre en la primera pantalla

Tenga en cuenta que debe colocar los comandos alrededor de la tubería entre comillas simples; de lo contrario, canalizará la salida de watch, no la salida de qstat.

enkrs
fuente
0

Para continuar con la respuesta de enkrs,

ver 'qstat | cabeza -300 | cola -15 '

obtendrá páginas arbitrarias en la salida de qstat.


fuente
0

Aquí hay un script bastante crudo que parece funcionar para varios comandos que le lancé

#!/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

Al ser bastante pedante, la transición entre actualizaciones no es tan suave como me gustaría que fuera. Naturalmente, al ser un script simple, no admite el resaltado de diff (watch -d). Además, el análisis de los argumentos de entrada se puede hacer mejor.

Shawn Chin
fuente
0

¿Qué tal solo: tail -f

geeklin
fuente
0

Implemento un script de Python simple para satisfacer esta solicitud, llamado "watchall"

Consíguelo por: pip install watchall

reemplace el reloj con watchall y disfrute de la pantalla desplazable. ahora solo admite las banderas -n y -d.

Mohammad Fatemipour
fuente
-1

puedes probar:

watch command > file

entonces en su archivo debería ver la salida anexa (ahora no tengo una caja de Linux para probar esto)


fuente
1
Eso no va a hacer lo que pretendes, realmente, simplemente se llenará filecon la misma salida una y otra vez. Ciertamente no aborda la pregunta original.
Greg Hewgill el
entonces no sé :)
1
¿Cambiar ">" a ">>" para que anexe los datos al archivo?
Rory