Содержимое выходного файла при их изменении

Я хочу вывести содержимое файла во время его изменения, например, если у меня есть файл foobar и я это делаю:

magic_command foobar

Текущий терминал должен отображать содержимое файла и ждать, пока я не знаю, я нажимаю ^ C.

Тогда, если с другого терминала я делаю:

echo asdf >> foobar

Первый терминал должен отображать вновь добавленную строку в дополнение к исходному содержимому файла (конечно, учитывая, что я не нажимал ^ C).

Я буду отмечать это как домашнюю работу, так как хочу исследовать и изучать Linux, но это не домашнее задание, это просто мое любопытство.

    Вы можете использовать tail command с -f :

     tail -f /var/log/syslog 

    Это хорошее решение для шоу в реальном времени.

    Когда мне нужно обнаруживать изменения файлов и делать что-то другое, кроме того, что имеет tail -f filename , я использовал inotifywait в скрипте, чтобы обнаружить изменения и действовать на него. Ниже приведен пример использования. См. man inotifywait для других имен и переключателей событий. Вам может потребоваться установить пакет inotify-tools , например, через sudo apt-get install inotify-tools .

    Вот пример сценария, называемый exec-on-change :

      #!/bin/sh # Detect when file named by param $1 changes. # When it changes, do command specified by other params. F=$1 shift P="$*" # Result of inotifywait is put in S so it doesn't echo while S=$(inotifywait -eMODIFY $F 2>/dev/null) do # Remove printf if timestamps not wanted printf "At %s: \n" "$(date)" $P done 

    В двух консолях я вводил команды следующим образом (где A> означает запись в консоли A, а B> означает запись в консоли B.)

     A> rm t; touch t B> ./exec-on-change t wc t A> date >>t A> date -R >>t A> date -Ru >>t A> cat t; rm t 

    Следующий выход из cat t появился в консоли A:

     Thu Aug 16 11:57:01 MDT 2012 Thu, 16 Aug 2012 11:57:04 -0600 Thu, 16 Aug 2012 17:57:07 +0000 

    Следующий выход из exec-on-change появился в консоли B:

     At Thu Aug 16 11:57:01 MDT 2012: 1 6 29 t At Thu Aug 16 11:57:04 MDT 2012: 2 12 61 t At Thu Aug 16 11:57:07 MDT 2012: 3 18 93 t 

    Сценарий exec-on-change завершается, когда я rm 'd t .

    Если вы хотите показать короткий файл, который подходит на одном экране терминала, и что меняется, возможно, весь файл, вы можете использовать watch :

    watch cat example.txt

     Every 2.0s: cat example.txt Sun Aug 3 15:25:20 2014 Some text another line 

    Он показывает весь файл каждые 2 секунды по умолчанию, включая необязательный заголовок:

    Опция -d ( --differences ) будет выделять изменения из предыдущей версии вывода или из первой версии.

    less имеет следующий режим, похожий на tail -f – просто нажмите F когда вы его открыли.

    У меня есть три решения:

    1) tail -f – хорошая идея

    2) у нас также есть tailf для использования

    3) третий – скрипт bash:

     #!/bin/bash GAP=10 #How long to wait LOGFILE=$1 #File to log to if [ "$#" -ne "1" ]; then echo "USAGE: `basename $0` <file with absolute path>" exit 1 fi #Get current long of the file len=`wc -l $LOGFILE | awk '{ print $1 }'` echo "Current size is $len lines." while : do if [ -N $LOGFILE ]; then echo "`date`: New Entries in $LOGFILE: " newlen=`wc -l $LOGFILE | awk ' { print $1 }'` newlines=`expr $newlen - $len` tail -$newlines $LOGFILE len=$newlen fi sleep $GAP done exit 0