Существует ли пейджинговая версия `watch`?


24

В оболочке UNIX, как я могу получить эффект, аналогичный watchкоманде, но с подкачкой страниц, чтобы я мог прокручивать вывод, если он занимает более одного экрана?

Другими словами, я хочу программу, которая есть watchто, что lessнужно cat.

В качестве примера, скажем, я хотел посмотреть вывод qstat, я мог бы использовать

watch qstat

смотреть вывод qstat, но это может показать только первый экран.

С пейджинговой версией watchя мог бы перемещаться в выводе, так как он все еще постоянно обновляется watch. Есть ли способ сделать это в настоящее время с существующими утилитами?


Это, вероятно, принадлежит SuperUser или, возможно, ServerFault.

Вы, вероятно, правы, как я могу переместить это?
Дэвид Дин

Три человека проголосовали, чтобы переместить это так далеко; если еще двое (или модератор) проголосуют за его перемещение, это произойдет автоматически.
Грег Хьюгилл

Почему бы просто не открыть большее окно и вообще не заниматься поиском?
Марчин

1
потому что мой экран уже заполнен? зачем использовать, lessкогда вы можете просто использовать catи большее окно?
Дэвид Дин

Ответы:


18

Вместо изменения команды «смотреть» используйте экран!

Например, предположим, что вам нужно видеть 300 строк в высоту и 100 символов в ширину и перемещаться по ним. После запуска экрана принудительно задайте размер таким образом:

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

Теперь начните свою команду часов. Затем вы можете использовать C-a <ESC>страницу вокруг дисплея.

К сожалению, дисплей не обновляется в режиме копирования. Но если вы хотите настроить, какую часть окна вы просматриваете, самый простой способ - это повторно запустить команды высоты / ширины, так как по умолчанию ваш терминал показывает нижний правый угол виртуального окна.


единственная проблема заключается в том, как непрерывно повторять команду, в то же время отключая экран между каждым движением
Дэвид Дин

К сожалению, я имел в виду запустить команду watch внутри экрана. Исправлена.
MikeyB

yartls - еще одна причина любить экран :)
Уоррен

обратите внимание, что C-это акаctrl-
Генри

5

Вы можете попробовать это:

в то время как vmstat; спать 1; сделано | Меньше

замените vmstat на qstat и настройте сон в соответствии с вашими потребностями


все это повторяет команду less, а это означает, что вам нужно продолжать прокручивать, чтобы увидеть последние результаты.
Дэвид Дин

Да, но вы можете прокрутить назад. Вы не можете иметь оба сразу. Нажатие клавиши F означает, что заглавная буква «F» будет работать как хвост.
Spacen Jasset


2

Хорошо, я немного поработал watchless. Это немного грубо, и это, кажется, еще не полностью работает, но здесь идет:

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

Вы должны вручную использовать Rключ меньше, чтобы обновить дисплей.

Похоже, работает для, watchless dateно не для watchless qstatили watchless pstree, которые оба показывают пустым. Любые идеи?


Вы должны использовать второй файл, чтобы записать вывод следующего запуска команды, а затем mvэтот второй файл в файл, считываемый lessкак mvатомарный. В противном случае lessможно подумать, что файл исчез, если запрос на обновление запрашивается одновременно с записью файла в "$@" > $out. Вы также должны записать в выходной файл один раз перед началом цикла.
Орельен Омс

0

Я не вижу, как это может быть реализовано при изменении содержимого строки и watchбудет возвращаться к первой строке каждые 2 секунды, даже если вы могли бы прокрутить вниз.

Некоторые обходные пути:

watch 'qstat | tail -n40' показать вывод qstat, начиная с 40-й строки снизу

watch 'qstat | grep jsmith' чтобы получить вывод, чтобы интересующие вас строки всегда были на первом экране.

Обратите внимание, что вам нужно поместить команды вокруг канала в одинарные кавычки - в противном случае вы будете передавать выходные данные watch, а не выходные данные qstat.


0

Чтобы продолжить ответ Enkrs,

смотреть 'Qstat | голова -300 | хвост -15 '

вы получите произвольные страницы в выводе qstat.


0

Вот довольно грубый скрипт, который, кажется, работает для нескольких команд, которые я набросал

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

Используется как таковой:

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

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

Будучи довольно педантичным, переход между обновлениями не так гладок, как хотелось бы. Естественно, будучи простым скриптом, он не поддерживает подсветку diff (watch -d). Кроме того, анализ входных аргументов может быть сделан лучше.



0

Я реализую простой скрипт на Python для удовлетворения этого запроса, с именем «watchall»

получите это: pip install watchall

замените часы на часы и наслаждайтесь прокручиваемым экраном. теперь он поддерживает только флаги -n и -d.


-1

можешь попробовать:

watch command > file

тогда в вашем файле вы должны увидеть вывод appendend (у меня сейчас нет linux box для проверки этого)


1
Это не будет делать то, что вы намереваетесь, на самом деле, оно просто будет заполняться fileодним и тем же выводом снова и снова. Это, конечно, не относится к первоначальному вопросу.
Грег Хьюгилл

тогда я не знаю :)

1
Измените «>» на «>>», чтобы добавить данные в файл?
Рори
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.