Хвост без хвоста?

Есть ли в Solaris команда для чтения файла и когда он доходит до конца для потоковой передачи, как это делает tail? Мне нужно прочитать файл с самого начала, и это бинарный файл.

Информация о Solaris и Linux будет принята с благодарностью.

2 ответа

Решение

tail -9999f будет делать что-то близкое к тому, что вы хотите. Добавьте больше 9, если ваш файл больше.

Проблемы:

  1. Двоичные файлы могут не содержать символов новой строки. tail -f будет ждать новой строки, прежде чем распечатывать что-либо.
  2. Версия tail в Solaris (вы не упомянули, какой Solaris, но это, вероятно, не имеет значения), вероятно, не поддерживает эту опцию. Может поддержать tail -n 9999 -f, Возможно, вам придется приобрести GNU-версию tail.
  3. Поскольку файл постоянно растет, существует условие гонки между выяснением его размера и запуском хвостового процесса. Вы можете пропустить начало файла, если не попросите его набрать достаточно строк.
  4. tail не будет знать, когда вы действительно закончили запись в файл, так что ваш gzip процесс никогда не закончится. Я не уверен, что произойдет, когда ты ctrl-c положить конец tail процесс, но вполне вероятно, что gzip очистит после себя и удалит файл, над которым он работал.

Я предлагаю запустить исходную программу и передать вывод в gzip следующим образом:

./my_program | gunzip > new_file.txt

Таким образом, gunzip будет ждать, если my_program идет медленно, но все равно завершится, когда истинный конец файла обозначен my_program отделка.

Возможно, вам придется переписать вашу программу для записи в STDOUT, а не напрямую в файл.

Редактировать:

После просмотра справочной страницы можно решить три из приведенных выше проблем. С использованием -c <bytes> вариант вместо -n <lines> смягчает проблему 1. Использование -n +0 или же -c +0 смягчает проблему 3. Использование --pid=<PID> заставит хвост завершиться, когда оригинальная программа (работает как <PID>) завершает, что смягчает проблему 4.

В Linux вы можете использовать tail -f -n +0 /path/filename чтобы увидеть это. Хотя -n, как правило, относится к числу строк в конце файла, которые вы хотите напечатать, когда они пройдены +<n> он начинается в n-й строке от начала файла.

От tail --help:

-n, --lines=K            output the last K lines, instead of the last 10;
                         or use -n +K to output lines starting with the Kth
Другие вопросы по тегам