Команда tail — очень полезная команда Linux при работе с файлами. Хотите узнать, как использовать ее наилучшим образом? Продолжайте читать 🙂

Команда Linux tail позволяет увидеть последние строки текстового файла в Linux. Сценарий, в котором это может быть чрезвычайно полезно, — работа с журналами приложений. Команда tail также может использоваться вместе с конвейером для фильтрации вывода другой команды.

Базовое использование команды tail довольно простое, но в этом уроке мы рассмотрим практические варианты использования, которые делают tail весьма удобным.

Давайте начнем!

Выделить заданное количество строк из файла

Я создал файл tail.txt, где каждая строка представляет собой число от 1 до 10.

$ cat tail.txt 
1
2
3
4
5
6
7
8
9
10 

Вывод, который мы получим при передаче этого файла команде tail, будет следующим:

$ tail tail.txt 
1
2
3
4
5
6
7
8
9
10 

Интересно, что вывод такой же, как и у первой команды cat.

Давайте посмотрим, что произойдет, если мы добавим в наш файл две дополнительные строки с числами 11 и 12.

Затем мы снова запускаем команду tail

$ tail tail.txt
3
4
5
6
7
8
9
10
11
12 

На этот раз вы видите, что первые две строки файла отсутствуют. Это потому что…

Команда tail по умолчанию возвращает последние 10 строк файла.

А что, если мы хотим вернуть только последние 5 строк?

Вы можете использовать следующий синтаксис:

$ tail -5 tail.txt
8
9
10
11
12 

Таким же образом…

Чтобы получить последние 100 строк файла с помощью команды Linux tail, можно использовать команду tail -100 <имя_файла>.

Выполнение команды Linux Tail в реальном времени

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

Представьте, что у вас есть файл журнала, в который ваше приложение записывает данные, и вы хотите отслеживать его непрерывно, а не запускать команду tail несколько раз.

Это может быть полезно для получения представления о трафике, получаемом вашим приложением в режиме реального времени.

Для мониторинга файла журнала (или текстового файла в целом) в режиме реального времени используйте следующую команду tail:

tail -f <filename>

Предположим, что имя файла журнала нашего приложения — application.log и он имеет следующее содержимое:

$ cat application.log
Request received by user1
Profile for user1 retrieved
Profile for user1 updated 

Теперь в одной оболочке выполните следующую команду:

$ tail -f application.log

Затем откройте вторую оболочку (или терминал) и выполните следующую команду, чтобы добавить новую строку в конец нашего файла журнала.

$ echo "Application closed by user1" >> application.log 

В первом терминале вы увидите следующее:

$ tail -f application.log 
Request received by user1
Profile for user1 retrieved
Profile for user1 updated

Application closed by user1 

Примечание: после запуска команды tail -f в первом терминале я нажал Enter один раз, чтобы создать визуальный пробел после существующих строк нашего файла журнала. Это распространенный подход, используемый для того, чтобы четко видеть любые новые строки, добавленные в файл журнала.

Чтобы остановить или завершить выполнение команды tail -f, используйте CTRL+C.

Использование команды Linux Tail с каналом

Ранее мы уже видели, что для получения последних n строк файла с помощью tail можно выполнить команду ниже:

tail -n <filename>

Тот же вывод можно получить, используя Linux pipe и команду cat.

cat <filename> | tail -n

Давайте посмотрим, как это работает с нашим файлом application.log.

$ tail -3 application.log      
Profile for user1 retrieved
Profile for user1 updated
Application closed by user1
$ 
$ cat application.log | tail -3
Profile for user1 retrieved
Profile for user1 updated
Application closed by user1 

Вы можете видеть, что вывод двух команд идентичен. Во втором сценарии конвейер берет вывод команды cat и передает его в качестве ввода команде tail.

Канал Linux используется для отправки выходных данных команды, расположенной перед каналом, на входные данные команды, расположенной после канала.

Использование tail с командой Linux grep

Зачем использовать команды grep и tail вместе?

Представьте, что у вас есть приложение, которое каждую минуту записывает сотни строк в файл журнала, и вы хотите видеть только новые записи журнала, соответствующие определенному критерию.

Например, вы хотите просмотреть все записи журнала, относящиеся к пользователю user2, но не хотите просматривать записи для пользователя user1.

Откройте один терминал и выполните следующую команду:

$ tail -f application.log | grep user2 

Затем во втором терминале выполните следующие команды echo, чтобы добавить четыре новые строки в конец файла application.log:

$ echo "Application opened by user1" >> application.log 
$ echo "Application opened by user2" >> application.log
$ echo "Application closed by user1" >> application.log 
$ echo "Application closed by user2" >> application.log 

Прежде чем продолжить, проверьте с помощью команды cat, что четыре строки были добавлены в конец файла application.log.

Теперь откройте первый терминал, в котором вы запускали команду tail -f.

Что вы видите?

$ tail -f application.log | grep user2

Application opened by user2
Application closed by user2

Вы видите только строки, содержащие строку user2, поскольку мы использовали команду grep для фильтрации вывода команды tail.

Эта команда будет иметь огромное значение при поиске нужной вам информации в файле журнала, поскольку она будет игнорировать все строки, которые вас не интересуют.

Обычный способ отслеживания строк в журнале приложения, относящихся к конкретному запросу, заключается в следующем:

  • Присвойте запросу уникальный идентификатор.
  • Запишите уникальный идентификатор в каждую строку журнала приложения.
  • Найдите строки, содержащие определенный идентификатор запроса.

Как отслеживать несколько файлов с помощью команды tail

Общим стандартом для приложений является наличие журнала приложений и журнала ошибок.

Журнал ошибок используется для хранения ошибок приложений в одном месте, что упрощает процесс устранения неполадок приложений.

Создайте файл с именем error.log с помощью команды touch, а затем добавьте в файл две строки с помощью команды echo.

$ touch error.log
$ echo "Error1" >> error.log 
$ echo "Error2" >> error.log
$ cat error.log 
Error1
Error2 

Чтобы применить команду tail к двум файлам одновременно, можно использовать следующую команду:

tail -f <filename1> <filename2>

Теперь мы будем использовать команду tail для одновременного мониторинга содержимого файлов application.log и error.log.

$ tail -f application.log error.log 

==> application.log <==
Request received by user1
Profile for user1 retrieved
Profile for user1 updated
Application closed by user1
Application opened by user1
Application opened by user2
Application closed by user1
Application closed by user2 

==> error.log <==
Error1
Error2 

Добавьте новую строку в конец файла error.log.

$ echo "Error3" >> error.log  

Обратите внимание, как новая строка становится видимой в первом терминале, где вы запускаете команду tail.

Заключение

После этого урока вы должны хорошо понимать, как работает tail и как его можно использовать для мониторинга файлов в режиме реального времени.

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

Written by Иван Васильков

Системный администратор и DevOps с опытом 10+ лет.