Откройте текстовый файл в терминале и автоматически обновляйте его при каждом изменении.


15

Как открыть текстовый файл в терминале с мгновенным автоматическим обновлением при каждом его изменении?

Я смотрел vimс помощью :set autoread, но он требует некоторого элементарного ввода (например, нажатие клавиши внутри vim), чтобы вызвать обновление.

Я хочу, чтобы автоматическое обновление происходило без помощи рук. Есть ли какой-нибудь хак для этого?

Я использую Crunchbang 11, но мне вполне комфортно с терминалом.


Для чего это хорошо? О чем этот файл? Если это журнал, в него обычно добавляются новые строки внизу, тогда вы можете просто использовать tail -f $file.
jirib

В частности, я пишу скрипт на Python, который записывает другой текстовый файл, а не просто добавляет новые строки внизу. Я хотел бы контролировать этот текстовый файл.
Кит

Inotify .......?
Джириб

Я не знаком с inotify. В поисках, это API, к которому мне нужно получить доступ при программировании на C, что я не склонен делать в ближайшее время. Я ищу решение командной оболочки.
Кит

1
Существует набор инструментов, которые вы можете использовать из командной строки, который обычно называется inotify-tools. Они используют встроенную в ядро ​​функцию, называемую inotify. Каждый раз, когда файл обрабатывается по событию, отправляется через inotify, на котором вы можете действовать. Много прог. Langs. такие как Python, Perl и т. д. имеют библиотеки, которые обертывают API Inotify. Смотрите википедию pg: en.wikipedia.org/wiki/Inotify
slm

Ответы:


26

Это должно показать вам файл один раз в секунду:

watch -n 1 cat file

1
Это то, что я ищу. Благодарность! Я продлил это дальше сwatch -tpcn 1 pygmentize -g filename
Кит

@ Будьте осторожны watch -g, это не работает так, как вы ожидаете .
Тердон

@terdon, -gпереключатель на самом деле для pygmentize. В любом случае, спасибо за предупреждение.
Кит

Если содержимое файла превышает одну страницу, с помощью этого вы не можете прокрутить экран, чтобы проверить остальное содержимое файла.
CodyChan

1
Почему не просто watch -n 1 tail file?
Варун

8
tail -f /var/log/syslog

Показывает обновления системного журнала по мере их добавления в файл.


Это показывает строки, как они добавлены правильно? ОП нуждается в полном обновлении.
Sean256

работает на windows с git-bash тоже
Дэвид

3

Я хотел бы использовать, watchкак предлагает другой ответ, но только для того, чтобы показать вам, как можно подойти к казалось бы сложной проблеме, используя строительные блоки, предоставляемые оболочкой, такой как Unix; цикл while может быть простым способом выполнения вашего цикла.

$ while [ 1 ]; do clear; date; cat <afile>; sleep 1 ;done

пример

$ while [ 1 ]; do clear; date; cat sample.txt; sleep 1 ;done
Fri Nov 15 09:17:39 EST 2013
1
2
3
4
5

Экран очищается, а затем через секунду это отображается:

Fri Nov 15 09:17:40 EST 2013
1
2
3
4
5

2

Как предлагается в комментариях, вы также можете использовать, inotifyхотя это излишне. Безусловно, самым простым является использование watch. Вот один из способов сделать это inotify:

  1. Установить inotify-toolsпакет

    sudo apt-get install inotify-tools
    
  2. Используйте, inotifywatchчтобы проверить ваш файл на наличие изменений. Запустите его в цикле и catв файле, если обнаружены изменения (вот почему я grepдля строки total):

    while true; do 
      inotifywatch -e modify -t 1 kk 2>/dev/null | grep -q total && 
      echo "$(date;cat kk)"; 
    done
    

Переход -q(или --quiet) к grepзаставит заглушить совпавшую строку «итого».
FichteFoll

@FichteFoll хороший момент (пожалуйста, не обращайте внимания на мой предыдущий комментарий, если вы видели его до того, как я удалил, я был медленным). Спасибо, отредактировал.
Тердон

0

watch(1)это действительно полезный инструмент. [1]

Я не рекомендовал бы использовать catвсе же.

Вместо этого используйте headили tailдля того, нужно ли вам видеть начало или конец файла.

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