tail
Вывод последних строк файла и слежение за обновлениями в реальном времени
Описание
tail — утилита для вывода конца файла. По умолчанию выводит последние 10 строк. Как и head, входит в пакет GNU coreutils. Команда незаменима при работе с лог-файлами: последние записи лога — это самые свежие события, именно там находятся актуальные ошибки и диагностическая информация.
Флаг -f (follow) делает tail по-настоящему мощным инструментом мониторинга: команда не завершается после вывода последних строк, а продолжает работу, выводя новые строки по мере их появления в файле. Это ключевой инструмент системного администратора при отладке приложений в реальном времени — аналог «живого лога» в GUI-инструментах.
tail также умеет начинать вывод с произвольного места файла: флаг -n +N (с плюсом) означает «начиная со строки N», что позволяет пропустить заголовок файла или обработать только новую часть файла данных.
Синтаксис
Компоненты команды:
- tail — имя команды
- [ОПЦИИ] — флаги для указания количества строк, байт, режима слежения
- [ФАЙЛ]... — один или несколько файлов; без файла — читает из
stdin
Важное отличие от head: положительное значение с плюсом (-n +N) означает «начиная со строки N», а без плюса (-n N) — «последние N строк».
Флаги и опции
| Флаг | Описание | Пример |
|---|---|---|
-n N |
Вывести последние N строк. Если N с плюсом (+N), выводит строки начиная с N-й от начала файла. |
tail -n 20 app.logtail -n +2 data.csv |
-f |
Follow — следить за файлом: выводить новые строки по мере их добавления. Завершение: Ctrl+C. Незаменим при мониторинге логов в реальном времени. | tail -f /var/log/syslog |
-F |
Follow by name — как -f, но продолжает следить даже если файл был пересоздан (ротация логов). Использует имя файла, а не дескриптор. |
tail -F /var/log/nginx/error.log |
-c N |
Вывести последние N байт. Поддерживает суффиксы K, M, G. С плюсом (+N) — начиная с байта N. |
tail -c 1K access.log |
-q |
Тихий режим: не выводить заголовки с именами файлов при обработке нескольких файлов. | tail -q -n 5 *.log |
-v |
Подробный режим: всегда выводить заголовок с именем файла, даже при одном файле. | tail -v app.log |
-s N |
При использовании с -f — интервал опроса файла в секундах (по умолчанию 1.0). Уменьшение ускоряет реакцию, увеличение снижает нагрузку на диск. |
tail -f -s 0.1 app.log |
--retry |
Продолжать попытки открыть файл, если он недоступен. Используется с -f для файлов, которые ещё не созданы. |
tail -f --retry app.log |
--pid=PID |
При использовании с -f — завершить tail, когда завершится процесс с указанным PID. Удобно для мониторинга лога запущенного приложения. |
tail -f app.log --pid=1234 |
-z |
Использовать нулевой байт как разделитель строк (для файлов с именами, содержащими пробелы). | tail -z -n 5 file.txt |
Паттерны использования
Мониторинг лога приложения
Самый частый сценарий — следить за новыми записями в логе:
# Простой мониторинг
tail -f /var/log/nginx/access.log
# Мониторинг с фильтрацией ошибок
tail -f /var/log/app.log | grep --line-buffered ERROR
# Следить за несколькими логами сразу
tail -f /var/log/nginx/error.log \
/var/log/app/production.log
Слежение с ротацией логов (-F)
-F не теряет файл после ротации (logrotate):
# Использовать -F вместо -f для production-логов tail -F /var/log/nginx/error.log # Если файл ещё не существует — ждать появления tail -F --retry /var/log/app/new.log # Разница: # -f следит за файловым дескриптором # -F следит за именем файла (безопаснее)
Пропуск заголовка CSV
Обработать все строки файла, кроме первой (заголовка):
# Пропустить заголовок и обработать данные
tail -n +2 employees.csv | \
awk -F',' '{sum += $3} END {print sum}'
# Пропустить первые 10 строк комментариев
tail -n +11 config.ini | grep -v '^#'
# Объединить CSV без дублирования заголовков
head -n 1 part1.csv > combined.csv
tail -n +2 part1.csv >> combined.csv
tail -n +2 part2.csv >> combined.csv
Диагностика запуска приложения
Отслеживать лог во время запуска сервиса до появления нужной строки:
#!/bin/bash
# Запустить сервис и ждать готовности
systemctl start myapp
echo "Ожидание запуска..."
# Следить за логом, выйти когда появится "Ready"
tail -f /var/log/myapp.log | \
while IFS= read -r line; do
echo "$line"
if echo "$line" | grep -q "Server started"; then
break
fi
done
echo "Сервис готов!"
Последние N строк из конвейера
Ограничить вывод команды — взять только последние результаты:
# Последние 5 коммитов git git log --oneline | tail -n 5 # Последние 3 строки истории bash history | tail -n 3 # Наименее популярные страницы сайта sort -n access.log | tail -n 20
Мониторинг с автозавершением
Завершить мониторинг автоматически при завершении процесса:
#!/bin/bash # Запустить приложение в фоне python manage.py runserver & APP_PID=$! # Следить за логом, пока приложение живёт tail -f django.log --pid=$APP_PID echo "Приложение завершилось (PID $APP_PID)"
Советы и предупреждения
При фильтрации вывода
tail -f через grep обязательно добавляйте флаг --line-buffered к grep, иначе буферизация вывода задержит появление строк: tail -f app.log | grep --line-buffered "ERROR".
Если вы часто следите за несколькими логами одновременно, установите утилиту
multitail (apt install multitail). Она разделяет экран на несколько областей и показывает каждый лог в своей области с цветовой подсветкой.
Паттерн
tail -n +2 data.csv — стандартный способ пропустить строку заголовков CSV при обработке в bash-скриптах с while IFS=',' read -r col1 col2 col3.
В production-окружениях всегда предпочитайте
tail -F вместо tail -f. При ротации логов (например, через logrotate) команда tail -f продолжает следить за старым файловым дескриптором и пропустит новые записи в новом файле. Флаг -F отслеживает файл по имени и автоматически переключается на новый файл.
Команда
tail -n +N читает весь файл с начала до нужной позиции — это может быть медленно на очень больших файлах. Для произвольного доступа к строкам в огромных файлах используйте sed -n 'Np' или предварительно создайте индекс.