Existe-t-il une version de pagination de `watch`?

24

Sous un shell UNIX, comment obtenir un effet similaire à la watchcommande, mais avec la pagination pour pouvoir faire défiler la sortie si elle occupe plus d'un écran?

En d'autres termes, je veux un programme qui soit à watchce qui lessest à cat.

À titre d'exemple, disons que je voulais regarder la sortie de qstat, je pourrais utiliser

watch qstat

pour regarder la sortie de qstat, mais cela ne peut que montrer le premier écran.

Avec une version de pagination de watch, je serais en mesure de se déplacer dans la sortie car elle est toujours mise à jour en continu par watch. Existe-t-il actuellement un moyen de le faire avec les utilitaires existants?

David Dean
la source
Cela appartient probablement à SuperUser ou peut-être à ServerFault.
Vous avez probablement raison, comment puis-je le déplacer?
David Dean
Trois personnes ont voté pour le déplacer jusqu'à présent; si deux autres personnes (ou un modérateur) votent pour le déplacer, cela se fera automatiquement.
Greg Hewgill
Pourquoi ne pas simplement ouvrir une fenêtre plus grande et abandonner complètement la pagination?
Marcin
1
parce que mon écran est déjà plein? pourquoi utiliser lessquand vous pouvez simplement utiliser catet une plus grande fenêtre?
David Dean

Réponses:

18

Plutôt que de modifier la commande 'watch', utilisez screen!

Par exemple, disons que vous devez pouvoir voir 300 lignes de hauteur et 100 caractères de largeur et vous déplacer. Après avoir démarré l'écran, forcez la taille ainsi:

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

Maintenant, lancez votre commande watch. Vous pouvez ensuite utiliser C-a <ESC>pour feuilleter autour de l'écran.

Malheureusement, l'affichage ne se rafraîchit pas en mode copie. Mais si vous souhaitez ajuster la section de la fenêtre que vous visualisez, le moyen le plus simple peut être de réexécuter les commandes hauteur / largeur car par défaut votre terminal affiche le coin inférieur droit de la fenêtre virtuelle.

MikeyB
la source
le seul problème est alors de savoir comment répéter continuellement la commande, tout en masquant l'écran entre chaque aller
David Dean
Oups, je voulais dire exécuter la commande watch à l'intérieur de l'écran. Fixé.
MikeyB
yartls - encore une autre raison d'aimer l'écran :)
warren
notez que C-c'est akactrl-
henry
5

Vous pouvez essayer ceci:

tandis que vmstat; dors 1; fait | Moins

remplacez vmstat par qstat et ajustez le sommeil à vos besoins

Spacen Jasset
la source
tout cela ne fait que répéter la commande dans less, ce qui signifie que vous devez continuer à faire défiler pour voir la dernière sortie.
David Dean
Oui, mais vous pouvez revenir en arrière. Vous ne pouvez pas avoir les deux à la fois. En appuyant sur shift f, c'est-à-dire le «F» majuscule fonctionnera comme la queue.
Spacen Jasset
2

OK, j'ai essayé un peu une watchlessfonction. C'est un peu rude, et cela ne semble pas encore fonctionner complètement, mais voici:

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

Vous devez utiliser manuellement la Rclé en moins pour que l'affichage soit mis à jour.

Il semble fonctionner pour watchless datemais pas pour watchless qstatou watchless pstree, qui sont tous deux vides. Des idées?

David Dean
la source
Vous devez utiliser un second fichier pour écrire la sortie de la prochaine exécution de la commande, puis mvce second fichier à la lecture de fichier par lesscomme mvest atomique. Sinon, vous lesspourriez penser que le fichier a disparu si une actualisation est demandée en même temps que l'écriture du fichier avec "$@" > $out. Vous devez également écrire une fois dans le fichier de sortie avant de démarrer la boucle.
Aurélien Ooms
0

Je ne vois pas comment cela pourrait être implémenté lorsque le contenu de la ligne change et watchreviendrait à la première ligne toutes les 2 secondes même si vous pouviez faire défiler vers le bas.

Certaines solutions de contournement sont les suivantes:

watch 'qstat | tail -n40' pour afficher la sortie de qstat à partir de la 40e ligne à partir du bas

watch 'qstat | grep jsmith' pour récupérer la sortie afin que les lignes qui vous intéressent soient toujours dans le premier écran.

Notez que vous devez mettre les commandes autour du tuyau entre guillemets simples - sinon vous dirigerez la sortie de watch, pas la sortie de qstat.

enkrs
la source
0

Pour continuer sur la réponse d'enkrs,

regarder 'qstat | tête -300 | queue -15 '

vous amènera des pages arbitraires dans la sortie de qstat.


la source
0

Voici un script assez grossier qui semble fonctionner pour plusieurs commandes que j'ai lancées dessus

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

Utilisé comme tel:

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

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

Étant plutôt pédant, la transition entre les rafraîchissements n'est pas aussi fluide que je le souhaiterais. Naturellement, étant un script simple, il ne prend pas en charge le surlignage de diff (watch -d). En outre, l'analyse des arguments d'entrée peut être mieux effectuée.

Shawn Chin
la source
0

Que diriez-vous de juste: queue -f

geeklin
la source
0

J'implémente un script python simple pour satisfaire cette demande, nommé "watchall"

l'obtenir par: pip install watchall

remplacez la montre par watchall et profitez de l'écran défilant. maintenant, il ne prend en charge que les indicateurs -n et -d.

Mohammad Fatemipour
la source
-1

tu peux essayer:

watch command > file

puis dans votre fichier, vous devriez voir la sortie appendend (je n'ai pas de boîte linux maintenant pour tester cela)


la source
1
Cela ne fera pas ce que vous avez l'intention, vraiment, il se remplira toujours filede la même sortie. Cela ne répond certainement pas à la question initiale.
Greg Hewgill
alors je ne sais pas :)
1
Changer le ">" en ">>" pour lui faire ajouter les données au fichier?
Rory