Как я могу просмотреть весь файл, а также подождать, пока в этот файл будут добавлены дополнительные данные?

21

Я хочу прочитать весь файл и заставить его ждать ввода, точно так же, как и tail -f с отображением всего файла.

Длина этого файла всегда будет меняться, потому что это .logфайл.

Как я могу это сделать, если я не знаю длину файла?

malworm
источник
2
Вы уже знаете, что хвост близок к тому, что вы хотите. вы читали справочную страницу для этого?
njzk2
1
lessимеет клавишу «F». Полезно, если вам нужно взаимодействие.
Торбьерн Равн Андерсен

Ответы:

33

tailпозволяет добавить, -nчтобы указать количество строк для отображения с конца, который может использоваться вместе с -f. Если аргумент для -nначинается с +этого, это количество строк с начала ( 0и 1отображение всего файла с 2указанием пропустить первую строку, как указано @Ben). Так что просто сделайте:

tail -f -n +0 filename

Если ваши файлы журналов повернуты, вы можете добавить --retry(или объединить -f and --retryв -Fсоответствии с предложением @Hagen)

Также обратите внимание, что в графическом терминале вы можете использовать мышь и PageUp/ PageDownдля прокрутки назад в историю (при условии, что ваш буфер достаточно большой), эта информация остается там, даже если вы используете Ctrl+ Cдля выхода tail. Если вы используете lessэто гораздо менее удобно, и AFAIK, вы должны использовать клавиатуру для прокрутки, и я не знаю средств, чтобы не lessдеинициализировать termcap, если вы забудете начать с него -X.

Энтон
источник
1
+1 Ваш ответ появился, как только я опубликовал свой, и хотя мой работает, ваш лучше.
Джули Пеллетье
1
Я получил сообщение, когда я все еще печатал, что там был другой ответ, и что я должен нажать, чтобы обновить. Ваш ответ выполнит работу, но я не удивлюсь, что подсчет с самого начала (принудительный с +) реализован более эффективно.
Anthon
1
+1для обучения меня о +0. Вы можете хотеть -Fвместо того, -fчтобы вращать файлы журнала
Хаген фон Айцен
Я думаю, что здесь есть один за другим. tail -n +1показывает начало файла для меня и tail -n +2пропускает одну строку. Я думаю, что номер является номером строки первой отображаемой строки.
Бен Милвуд
1
@ Антон, спасибо! Это именно то, что мне нужно!
Malworm
37

Есть способ лучше достичь этого:

less +F <file>

Он покажет вам весь файл, имеет полную мощность lessи будет ждать нового ввода. Если вы хотите прекратить ожидание ввода и прочитать определенную часть, вы можете остановить ее ^Cи продолжить с помощью F.

Команда Fвсегда доступна less, если вы решите следить за изменениями, когда файл открыт less, нажатие Fвключит его. Спасибо hiergiltdiestfu и wildcard за то, что указал на это.

Leandros
источник
2
Это действительно намного лучше, чем tail. Спасибо за совет; Я никогда бы не подумал использовать lessдля этого. Примечание для других: вы также можете просто запустить, less <file>а затем набрать F.
подстановочный знак
3

В дополнение к ответу / u / Anthon вы можете сделать что-то вроде:

{ cat filename; tail -0f filename; }

Эта -0опция для tail эквивалентна -n 0значению: 0 строк. Но -fбудет отображаться новые строки.

Вам не нужны брекеты { }. Я использовал их, потому что иногда вы хотите каким-то образом перенаправить файловые дескрипторы. Например:

{ cat ; tail -0f -; } < /var/log/messages

Отмечено Беном Милвудом: у вас может быть состояние гонки, когда файл увеличивается между концом catоперации и началомtail операции. Но опять же, это «академическая» проблема для академического решения.

Otheus
источник
3
Если размер файла увеличивается между catокончанием и tailначалом, вы не увидите эти строки. Вряд ли это будет грандиозно, но повод отдать предпочтение чистому tailрешению.
Бен Милвуд
Я думаю, что { cat; tail -n +0 -f; } < fileэто исправит гонку, потому что tail будет печатать любые новые данные, которые появляются между catвыходом и tailзапуском. Конечно, это делает catизлишним. Перенаправление происходит только один раз, и tailstdin - это дескриптор файла, который catуже считан в EOF, поэтому его текущая позиция находится там, где catостановлена. Вы можете проверить это, вставив echo foo >> fileвнутрь {}, чтобы создать гонку каждый раз.
Питер Кордес
2

watch Команда должна сделать это за вас.

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

less +FG 

У вас будет больше опций с lessкомандой прокрутки вашего файла, поскольку вы говорите, что это большой файл.

RajuBhai
источник
Меньше также не следует за растущим файлом.
Шадур
7
@Shadur, это так, для этого есть +Fвариант
Гленн Джекман