Как пользователи Linux, мы часто работаем с долгосрочными фоновыми процессами Linux, которые называются демонами или службами. Некоторые из общих примеров служб включают в себя Secure Shell (sshd), Network Manager (networkd), Volume Manager (LVM), Cron и так далее.
Многократно нам нужно отслеживать журналы этих служб для отладки проблем в системе. Однако одной из основных проблем является то, что эти службы генерируют много журналов, и большую часть времени процесс их анализа осложнен. Вот где мы можем использовать команду tail.
Команда tail является утилитой командной строки, аналогичной команде head, которая читает файл и выводит последние 10 строк (содержание) одного или нескольких файлов в стандартный вывод.
В этом практическом руководстве мы узнаем о команде tail. К концу этого руководства пользователи командной строки 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)
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? Делитесь своими мыслями в комментариях ниже.