Все знают о команде cat, которая используется для просмотра содержимого файлов. Но в некоторых случаях вам не нужно смотреть весь файл, иногда достаточно посмотреть только то, что находится в конце файла. Например, когда вы хотите посмотреть содержимое лог файла, то вам не нужно то, с чего он начинается, вам будет достаточно последних сообщений об ошибках.
Для этого можно использовать команду tail, она позволяет выводить заданное количество строк с конца файла, а также выводить новые строки в интерактивном режиме. В этой статье будет рассмотрена команда tail Linux.
Содержание статьи
Команда tail в Linux
Перед тем как мы будем рассматривать примеры tail linux, давайте разберем ее синтаксис и опции. А синтаксис очень прост:
$ tail опции файл
По умолчанию утилита выводит десять последних строк из файла, но ее поведение можно настроить с помощью опций:
- -c - выводить указанное количество байт с конца файла;
- -f - обновлять информацию по мере появления новых строк в файле;
- -n - выводить указанное количество строк из конца файла;
- --pid - используется с опцией -f, позволяет завершить работу утилиты, когда завершится указанный процесс;
- -q - не выводить имена файлов;
- --retry - повторять попытки открыть файл, если он недоступен;
- -v - выводить подробную информацию о файле;
В качестве значения параметра -c можно использовать число с приставкой b, kB, K, MB, M, GB, G T, P, E, Z, Y. Еще есть одно замечание по поводу имен файлов. По умолчанию утилита не отслеживает изменение имен, но вы можете указать что нужно отслеживать файл по дескриптору, подробнее в примерах.
Использование tail
Теперь, когда вы знаете основные опции, рассмотрим приемы работы с утилитой. Самый простой пример - выводим последние десять строк файла:
tail /var/log/syslog
Если вам недостаточно 10 строк и нужно намного больше, то вы можете увеличить этот параметр с помощью опции -n:
tail -n 100 /var/log/syslog
Когда вы хотите отслеживать появление новых строк в файле, добавьте опцию -f:
tail -f /var/log/syslog
Вы можете открыть несколько файлов одновременно, просто перечислив их в параметрах:
tail /var/log/syslog /var/log/Xorg.0.log
С помощью опции -s вы можете задать частоту обновления файла. По умолчанию данные обновляются раз в секунду, но вы можете настроить, например, обновление раз в пять секунд:
tail -f -s 5 /var/log/syslog
При открытии нескольких файлов будет выводиться имя файла перед участком кода. Если вы хотите убрать этот заголовок, добавьте опцию -q:
tail -q var/log/syslog /var/log/Xorg.0.log
Если вас интересует не число строк, а именно число байт, то вы можете их указать с помощью опции -c:
tail -c 500 /var/log/syslog
Для удобства, вы можете выбирать не все строки, а отфильтровать интересующие вас:
tail -f /var/log/syslog | grep err
Особенно, это полезно при анализе логов веб сервера или поиске ошибок в реальном времени. Если файл не открывается, вы можете использовать опцию retry чтобы повторять попытки:
tail -f --retry /var/log/syslog | grep err
Как я говорил в начале статьи, по умолчанию опция -f или --follow отслеживает файл по его имени, но вы можете включить режим отслеживания по дескриптору файла, тогда даже если имя измениться, вы будете получать всю информацию:
tail --follow=descriptor /var/log/syslog | grep err
Выводы
В этой статье была рассмотрена команда tail linux. С помощью нее очень удобно анализировать логи различных служб, а также искать в них ошибки. Надеюсь, эта информация была полезной для вас.
Захотел проверить на текстовом файле. Создал файл 1.txt, написал в терминале tail -f 1.txt, стал менять файл через текстовый редактор и изменения почему-то не отслеживались. Зато заработало с флагом -F, почему так? Неужели изменение файла через текстовый редактор - это его удаление и создание с тем же именем нового?
Как выйти или закрыть это?
sudo tail -n5 -f /var/...
Ctrl+Z только [2]+ Stopped делает
Спасибо!
Ctrl+Z сворачивает в фоновый режим. Для выхода используйте Ctrl+C.
подскажите ,пожалуйста, как с помощью tail просматривать лог последне-созданного файла ?
классная статья! наконец то что то годное. Уже 5 лет как захожу сюда, хороший справочник кстати )
Спасибо за статью!
Не подскажете, как исключить из вывода строки содержащие определенную последовательность символов?
tail -f /var/log/syslog | grep err
Выводит те строки в которых есть err. А что, если мне нужно наоборот. Чтобы выводилось все кроме err?
Благодарю!
Используйте опцию -v или --invert-match
Доброго времени суток!
Тестировал команду: tail --follow=descriptor (файл генерировал лог каждую секунду).
При тестировании команды изменил имя файла, за которым шло отслеживание tail. По итогу лог перестал обновляться (основная проблема).
Решение:
Использовать вместо "--folow=descriptor" -> -F
tail -F
Использовал следующую систему:
OS: Linux Mint 21.1 x86_64
Kernel: 6.4.2
Shell: bash 5.1.16
Доброго времени суток.
Есть ли примеры на --pid?
«
-n - выводить указанное количество строк из конца файла;
--pid - используется с опцией -f, позволяет завершить работу утилиты, когда завершится указанный процесс;
»