Поиск по сайту:

Как использовать команду tail в Linux с примерами


Как пользователи Linux, мы часто работаем с длительными фоновыми процессами Linux, которые называются демонами или службами. Вот некоторые из распространенных примеров таких служб: Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron, и этот список можно продолжить.

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

Команда tail — это утилита командной строки, аналогичная команде head, которая считывает файл и выводит последние 10 строк (содержимое) одного или нескольких файлов в стандартный вывод.

В этом практическом руководстве мы узнаем о команде хвоста. К концу этого руководства пользователи командной строки Linux смогут эффективно использовать команду tail.

Синтаксис команды tail

Синтаксис команды tail аналогичен другим командам Linux:

$ tail [OPTIONS] [FILE-1] [FILE-2] ...

1. Распечатайте последние 10 строк файла в Linux

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

$ tail /var/log/secure


Apr  2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr  2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr  2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr  2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

Здесь мы видим, что вышеуказанная команда показывает последние десять строк из файла /var/log/secure.

2. Печать последних N строк файла в Linux

В последнем примере команда выводит последние 10 строк данного файла. Тем не менее, мы можем использовать опцию -n, которая позволяет нам ограничить количество строк, которые будут напечатаны на экране, как показано на рисунке.

$ tail -n 3 /var/log/secure

Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

В этом примере мы видим, что теперь команда показывает только последние три строки, а не десять.

3. Игнорируйте первые n строк файла в Linux

Здесь мы можем использовать символ плюс (+) с опцией -n, что позволяет нам управлять начальной точкой из заданного файла.

Чтобы понять это, давайте воспользуемся значением +5 для начала вывода с 5-й строки:

$ tail -n +5 /var/log/secure

Apr  2 14:17:24 TecMint sshd[201178]: Disconnected from user tecmint 192.168.0.162 port 59774
Apr  2 14:17:24 TecMint sshd[201165]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 14:29:12 TecMint sshd[201366]: Accepted password for tecmint from 192.168.0.162 port 56378 ssh2
Apr  2 14:29:12 TecMint systemd[201371]: pam_unix(systemd-user:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session opened for user tecmint(uid=1002) by (uid=0)
Apr  2 14:29:12 TecMint sshd[201382]: Received disconnect from 192.168.0.162 port 56378:11: disconnected by user
Apr  2 14:29:12 TecMint sshd[201382]: Disconnected from user tecmint 192.168.0.162 port 56378
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

4. Показать последние n символов файла

Как и в случае со строками, мы также можем использовать команду для отображения последних N символов файла с помощью опции -c, как показано ниже:

$ tail -c 7 /var/log/secure

(uid=0)

В этом примере мы видим, что команда показывает последние семь символов ASCII данного файла.

5. Удалите первые n символов файла

Точно так же мы можем использовать символ плюс (+) с опцией -c, чтобы пропустить первый N символ. Итак, давайте пропустим первую строку файла с помощью команды ниже:

$ tail -c +5 /var/log/secure

Apr  2 03:02:59 TecMint sudo[162801]: root : TTY=pts/2 ; PWD=/root ; USER=root ; COMMAND=/bin/dnf install R
Apr  2 03:02:59 TecMint sudo[162801]: pam_unix(sudo:session): session opened for user root(uid=0) by root(uid=0)
Apr  2 03:03:02 TecMint sudo[162801]: pam_unix(sudo:session): session closed for user root
Apr  2 03:11:17 TecMint groupadd[163602]: group added to /etc/group: name=avahi, GID=70
Apr  2 03:11:18 TecMint groupadd[163602]: group added to /etc/gshadow: name=avahi
Apr  2 03:11:18 TecMint groupadd[163602]: new group: name=avahi, GID=70
Apr  2 03:11:19 TecMint useradd[163610]: new user: name=avahi, UID=70, GID=70, home=/var/run/avahi-daemon, shell=/sbin/nologin, from=none
Apr  2 03:13:41 TecMint groupadd[163704]: group added to /etc/group: name=colord, GID=986
Apr  2 03:13:41 TecMint groupadd[163704]: group added to /etc/gshadow: name=colord

Здесь мы видим, что команда показывает все строки, кроме первой.

6. Отображение имени файла в заголовке

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

Итак, давайте воспользуемся опцией -v для включения заголовка отображения:

$ tail -n 3 -v /var/log/secure

==>/var/log/secure <==
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

В приведенном выше выводе ==> /var/log/secure <== представляет собой заголовок дисплея.

7. Отображение имени файла в качестве заголовка в нескольких файлах

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

$ tail -n 3 -v /var/log/secure /var/log/secure-20230402

==> /var/log/secure <==
Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

==> /var/log/secure-20230402 <==
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

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

8. Как отключить отображение заголовка в файле

В предыдущем примере мы видели, что команда включает заголовок дисплея при работе с несколькими файлами. Тем не менее, мы можем подавить это поведение по умолчанию с помощью опции -q.

$ tail -q -n 3 /var/log/secure /var/log/secure-20230402

Apr  2 14:29:12 TecMint sshd[201366]: pam_unix(sshd:session): session closed for user tecmint
Apr  2 15:12:55 TecMint sshd[202049]: Accepted password for root from 192.168.0.162 port 53334 ssh2
Apr  2 15:12:55 TecMint sshd[202049]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)
Mar 31 03:50:53 TecMint groupadd[156163]: new group: name=docker, GID=987
Mar 31 04:46:11 TecMint sshd[159403]: Accepted password for root from 192.168.0.162 port 46480 ssh2
Mar 31 04:46:11 TecMint sshd[159403]: pam_unix(sshd:session): session opened for user root(uid=0) by (uid=0)

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

9. Как следить за изменениями в файле

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

В таких случаях мы можем использовать опцию -f с командой, которая позволяет нам отслеживать изменения файла в режиме реального времени.

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

$ tail -f /var/log/messages


Apr  2 15:13:28 TecMint NetworkManager[741]:   [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr  2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr  2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr  2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr  2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr  2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr  2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr  2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Finished dnf makecache.

Здесь мы видим, что команда ждет бесконечно после отображения последних десяти строк:

Далее откроем другой терминал и добавим в файл numbers-2.txt какой-нибудь текст:

$ echo "View Logs in Real-Time" >> /var/log/messages

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

$ tail -f /var/log/messages

Apr  2 15:13:28 TecMint NetworkManager[741]:   [1680462808.8441] policy: set-hostname: current hostname was changed outside NetworkManager: 'TecMint'
Apr  2 15:13:28 TecMint systemd[1]: Starting Network Manager Script Dispatcher Service...
Apr  2 15:13:28 TecMint systemd[1]: Started Network Manager Script Dispatcher Service.
Apr  2 15:13:37 TecMint arpwatch[11001]: rename arp.dat -> arp.dat-: Operation not permitted
Apr  2 15:13:38 TecMint systemd[1]: NetworkManager-dispatcher.service: Deactivated successfully.
Apr  2 15:13:58 TecMint systemd[1]: systemd-hostnamed.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Starting dnf makecache...
Apr  2 15:18:03 TecMint dnf[202235]: Metadata cache refreshed recently.
Apr  2 15:18:03 TecMint systemd[1]: dnf-makecache.service: Deactivated successfully.
Apr  2 15:18:03 TecMint systemd[1]: Finished dnf makecache.
View Logs in Real-Time

Здесь мы видим, что команда tail показывает только что добавленный текст.

Знаете ли вы какой-нибудь другой лучший пример команды tail в Linux? Поделитесь с нами своим мнением в комментариях ниже.

Статьи по данной тематике: