Назад | Перейти на главную страницу

Команда оболочки для отслеживания изменений в файле

Я знаю, что в Unix была команда, которую я мог использовать для отслеживания файла и просмотра изменений, которые в него записываются. Это было весьма полезно, особенно для проверки файлов журналов.

Вы знаете, как это называется?

Ты имеешь ввиду

tail -f logfile.log

?

(Страница руководства для tail)

Вы, вероятно, имели в виду хвост, согласно ответу Джона Скита.

Еще один полезный - смотреть; это позволяет вам периодически запускать команду и видеть вывод в полноэкранном режиме. Например:

watch -n 10 -d ls -l /var/adm/messages

Запустит команду ls -l /var/adm/messages каждые 10 секунд и выделите разницу в выходе между последующими запусками. (Полезно, например, для наблюдения за тем, как быстро растет файл журнала).

inotifywait из инструменты inotify полезно, если вы хотите запускать команду каждый раз при изменении файла (или любых файлов в каталоге). Например:

inotifywait -r -m -e modify /var/log | 
   while read path _ file; do 
       echo $path$file modified
   done

Я предпочитаю использовать less +FG1 над tail -f потому что мне нужно искать в файле журнала конкретную ошибку или идентификатор. Если мне нужно что-то найти, я набираю ^C прекратить следить за файлом и ? чтобы начать поиск в обратном направлении.

Привязки клавиш почти такие же, как в vi. Любую команду можно инициализировать при запуске с помощью + вариант:

+cmd   Causes  the  specified  cmd  to be executed each time a new file is
       examined.  For example, +G causes less to  initially  display  each
       file starting at the end rather than the beginning.

Для очень длинных журналов я считаю удобным использовать -n опция, отключающая нумерацию строк. На странице руководства:

-n or --line-numbers
          Suppresses line numbers.  The default (to use line numbers)  may
          cause  less  to run more slowly in some cases, especially with a
          very large input file.  Suppressing line  numbers  with  the  -n
          option  will  avoid this problem.  Using line numbers means: the
          line number will be displayed in the verbose prompt and in the =
          command,  and the v command will pass the current line number to
          the editor (see also  the  discussion  of  LESSEDIT  in  PROMPTS
          below).

1. Совет rgmarcha за указание на это в комментариях.

Хвост великолепен ... также можно использовать меньше, начните меньше в файле, то есть меньше myfile, затем нажмите сдвиг+F. Это меньше действует как хвост.

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

#!/bin/bash
FILE="$1"
CMD="$2"
LAST=`ls -l "$FILE"`
while true; do
  sleep 1
  NEW=`ls -l "$FILE"`
  if [ "$NEW" != "$LAST" ]; then
    "$CMD" "$FILE"
    LAST="$NEW"
  fi
done

Сохранить как watch.sh и делай chmod u+x watch.sh. Затем я выполняю его так:

./watch.sh file.tex pdflatex

Если вы хотите, чтобы команда запускалась только в случае фактического изменения, вы можете использовать `md5sum "$FILE"` вместо того `ls -l "$FILE"`.

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

tailf logfile.log

Вы также можете использовать inotifywatch / inotifywait, которые подключаются к подсистеме ядра inotify. Таким образом, вы также можете следить за такими вещами, как «открыть», «закрыть» или «получить доступ».

Но если вы просто хотите, чтобы строки добавлялись к стандартному выводу, я согласен с хвостом.

Tail - это стандартный, традиционный, доступный везде инструмент unix. Немного более сложный инструмент - многоцелевой который может отслеживать несколько файлов одновременно и выделять синтаксис.

Если я хочу иметь возможность искать по файлу в дополнение к его отслеживанию, я использую меньше с командой «F».

При использовании tail имейте в виду, что необходимы дополнительные аргументы, если файл может быть перенесен или заменен редактированием (режим по умолчанию для vim's: w).

tail -f заставит tail сохранять дескриптор файла и следовать за ним. Если файл заменен, дескриптор будет изменен. Преимущество следования файловому дескриптору заключается в том, что если файл будет переименован, вы все равно будете следовать ему.

tail --follow = заставит tail отслеживать указанный файл, периодически открывая его, чтобы видеть, был ли он заменен.

--retry - еще одна полезная опция, если вы хотите отслеживать файл журнала, но файл еще не создан.

tail -F - это сокращение для --follow = --retry.

Забудьте о tailf, вам нужна команда diff. Вот хороший трюк, чтобы наблюдать за различиями, которые происходят в реальном времени (или близко) между двумя файлами или одним файлом, в который выполняется запись.

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

У вас есть 1 файл, и вы хотите посмотреть, как в него вносятся изменения:

Итак, вот что делать:

  1. скопировать файл

    cp file file2
    
  2. напишите сценарий bash, чтобы найти различия, и обновите файл2

    touch check-differences.sh
    nano check-differences.sh
    chmod 755 check-differences.sh
    
  3. Вот основная идея сценария. Сделайте запись в файл, если хотите

    #!/bin/bash
    diff file file2
    cp file file2
    
  4. Затем вы можете посмотреть различия на экране с помощью часов.

    watch ./check-differences
    

по умолчанию он будет обновляться каждые 2 секунды. Поэтому, если вам нужно вернуться и прочитать их, запишите вывод команды diff в файл сценария.

Или используйте cron для регулярного запуска вашего скрипта, если вам не нужен вывод.

Пока tail -f somefile.txt продолжает прокручивать новые данные, я иногда предпочитаю less +G somefile.txt а также посмотреть на патч последних данных в файле.