linux view-edit

tail

Вывод последних строк файла и слежение за обновлениями в реальном времени

Описание

tail — утилита для вывода конца файла. По умолчанию выводит последние 10 строк. Как и head, входит в пакет GNU coreutils. Команда незаменима при работе с лог-файлами: последние записи лога — это самые свежие события, именно там находятся актуальные ошибки и диагностическая информация.

Флаг -f (follow) делает tail по-настоящему мощным инструментом мониторинга: команда не завершается после вывода последних строк, а продолжает работу, выводя новые строки по мере их появления в файле. Это ключевой инструмент системного администратора при отладке приложений в реальном времени — аналог «живого лога» в GUI-инструментах.

tail также умеет начинать вывод с произвольного места файла: флаг -n +N (с плюсом) означает «начиная со строки N», что позволяет пропустить заголовок файла или обработать только новую часть файла данных.

Синтаксис

tail [ОПЦИИ] [ФАЙЛ]...

Компоненты команды:

Важное отличие от head: положительное значение с плюсом (-n +N) означает «начиная со строки N», а без плюса (-n N) — «последние N строк».

# Последние 10 строк (по умолчанию) tail file.txt # Последние 20 строк tail -n 20 file.txt tail -20 file.txt # краткая форма # Следить за файлом в реальном времени tail -f /var/log/nginx/access.log # Начиная со строки 50 (пропустить заголовок CSV) tail -n +2 data.csv # строки начиная со 2-й (пропустить 1-ю) tail -n +50 file.txt # начиная со строки 50 # Последние 100 байт tail -c 100 file.txt

Флаги и опции

Флаг Описание Пример
-n N Вывести последние N строк. Если N с плюсом (+N), выводит строки начиная с N-й от начала файла. tail -n 20 app.log
tail -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
При фильтрации вывода tail -f через grep обязательно добавляйте флаг --line-buffered к grep, иначе буферизация вывода задержит появление строк: tail -f app.log | grep --line-buffered "ERROR".
Совет: multitail для красивого мониторинга
Если вы часто следите за несколькими логами одновременно, установите утилиту multitail (apt install multitail). Она разделяет экран на несколько областей и показывает каждый лог в своей области с цветовой подсветкой.
Совет: tail -n +2 для обработки CSV в скриптах
Паттерн tail -n +2 data.csv — стандартный способ пропустить строку заголовков CSV при обработке в bash-скриптах с while IFS=',' read -r col1 col2 col3.
Предупреждение: -f vs -F при ротации логов
В production-окружениях всегда предпочитайте tail -F вместо tail -f. При ротации логов (например, через logrotate) команда tail -f продолжает следить за старым файловым дескриптором и пропустит новые записи в новом файле. Флаг -F отслеживает файл по имени и автоматически переключается на новый файл.
Предупреждение: tail -n +N на больших файлах
Команда tail -n +N читает весь файл с начала до нужной позиции — это может быть медленно на очень больших файлах. Для произвольного доступа к строкам в огромных файлах используйте sed -n 'Np' или предварительно создайте индекс.