Команда 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
для одновременного мониторинга нескольких файлов.