В этой статье мы пересмотрим инструмент Tail, покажем новичкам, как это работает, а ветеранам — что они, возможно, пропустили.
Что такое Tail
Tail — это основное приложение Unix-систем, предназначенное для чтения концов текстовых файлов. Оно также применимо для кое-чего еще, называемого канальными данными, но мы вернемся к этому позже (давайте не будем пока усложнять ситуацию). Хотя «чтение конца файла» звучит довольно самоочевидно, Tail является главным инструментом в арсенале любого эксперта, а многие практические применения мы сейчас изучим.
Работа с Tail
Для начала откройте терминал в папке, где есть текстовый файл, который послужит хорошим экспериментальным образцом — примером здесь будет текстовый файл со словами любимой песни. Выбрав подходящий файл, можно начать, введя команду Tail и приписав к ней имя этого файла, например:
1 |
S tail lyrics-AA-Tucker.txt |
По умолчанию Tail отображает последние десять строк файла, но это можно изменить с помощью так называемого «ключа» команды (он же — «опция» или «параметр»). Чтобы представить вам ваш первый ключ, давайте изменим этот вывод с 10 строк вывода текста по умолчанию до 15 строк. В общем синтаксисе команд терминала ключ обычно состоит из одного или двух дефисов.
за которыми следуют некоторые символы, а помещается он между командой и именем файла. Трудно это осмыслить? Это проще, чем кажется. Для нашего 15-строчного примера используем ключ -п. а затем требуемое число. Т. е. на практике наша измененная предыдущая команда на 15 строк вывода выглядит так:
1 |
$ tail -n 15 lyrics-AA-Tucker.txt |
Ну, а если вы хотите прочитать только последнюю строку файла? Тогда команда получится такой:
1 |
$ tail -n 1 lyrics-AA-Tucker.txt |
А если вам интересно — то да, есть противоположная команда для чтения начала файла, и да, имя ее head. Чтобы просмотреть первые 15 строк файла, надо ввести следующее:
1 |
$ head -n 15 lyrics-AA-Tucker.txt |
Те, кто хочет без затей прочитать весь файл сразу, попробуйте команду less:
1 |
$ less lyrics-AA-Tucker.txt |
Рекомендуем к прочтению: Самые быстрые и легкие дистрибутивы Linux
Другие возможности Tail
До сих пор мы смотрели целые строки вывода: а если вам нужна только часть строки? Tail позволяет изымать данные в байтах. Например, последние восемь байтов нашего файла берет такая команда:
1 |
$ tail -bytes 8 lyrics-AA-Tucker.txt |
Вы можете спросить: зачем кому-либо приспичат последние несколько символов файла? Применений есть много, и они разные, но в голову немедля приходят базы данных и игры. Умные программисты, создающие огромную электронную таблицу, хотели бы автоматизировать процесс, просто взяв последние символы файла, а игровые кодеры могут использовать это, допустим, для обновления таблиц лучших показателей.
Вероятно, вы заметили, что вместо одного дефиса были использованы два, а вместо одного символа — слово целиком. Команды Linux часто имеют альтернативный вариант ключа, поскольку целое слово легче считать или запомнить; но тогда обычно требуются два дефиса. Вместо -bytes можно также использовать ключ -c, но -bytes запоминается лучше!
Будучи основной утилитой Unix, Тейл также применима в сочетании с «каналами». Если вы не знакомы с каналами, то по сути они позволяют программам подключаться друг к другу, беря вывод одной программы и подавая его на вход другой.
Используем dmesg в качестве примера: она дает откровенную информацию о работе оборудования, но выводит массу текста, требующего времени для прокрутки. Нередко интересный материал находится в конце (в частности, для такой периферии, как беспроводные клавиатуры, геймпады и т.д.), так почему бы не отправить его в Tail?
Перенаправление dmesg в Tail через канал выглядит так:
1 |
$ dmesg I tail |
А ведь можно и дальше изощряться! Предположим, вы являетесь разработчиком периферии и ищете данные системы. Вы знаете. что ваш гаджет выводит две строки информации, и хотите разработать соответствующий скрипт. Даже используя канал, вы всё равно можете применять ключ, как раньше, поэтому та же команда, но с двумя строками вывода, будет выглядеть так:
1 |
$ dmesg I tail -n 2 |
Наконец, обычным применением Tail является мониторинг файла в «вечном» цикле, в ожидании чего-либо для добавления к имеющемуся файлу. Но это мы рассмотрим в следующем разделе…
Рекомендуем к прочтению: Мониторинг в Linux с помощью командой строки
Новые биты
«Новая» функциональность, о которой мы говорим, относится к 2009 г. Девять лет — это, как правило, большой срок в компьютерном мире, но учитывая, что Tail существует десятилетиями, давайте не будем об этом беспокоиться. Надеюсь, мы всё еще можем назвать это новым, не создавая сенсации (а если вы подлинный ветеран Unix, то есть хороший шанс, что данная функциональность всё-таки прошла мимо вас).
Так что же изменилось? Ну, ранее режим tail -F полагался на неуклюжую временную циклическую систему, по умолчанию проверяющую файл раз в секунду. Если ваш дистрибутив настроен с поддержкой inotify, то Tail будет работать, выполняя системные вызовы через API inotify. На практике это означает, что вместо ожидания и постоянных проверок, не изменилось ли что, inotify отслеживает события в системе, и Tail немедленно реагирует на любые опознанные изменения. В итоге получаем нечто гораздо более быстрое и эффективное, освобождающее драгоценные ресурсы.
Итак, чем тут воспользоваться? А это всё о -F.
Как упоминалось в предыдущем разделе, Tail можно оставить в непрерывном цикле и использовать как устройство мониторинга файлов. Обратите внимание на употребление здесь верхнего и нижнего регистра: с ключом -f (или —follow=descriptor при использовании без дополнительного аргумента) Tail остается в цикле и обновляет изменения файла на экране.
Однако в этом режиме Тейл будет по мере роста файла работать только с добавленными данными — как при использовании » («двойной морковки») в старой школе. А вот при использовании -F (это то же самое, что и -follow=name -retry) вы получите гораздо более полезный вывод: выходные данные в нем будут обновляться как в текстовом редакторе, изменяя и сохраняя обновленный файл, и даже будет обновлять измененные данные в предыдущих строках в тексте.
Ветеранам, возможно, не нужна помощь, чтобы это написать, но в примере с нашим именем файла команда будет такой:
1 |
$ tail -F lyrics-AA-Tucker.txt |
Или для тех, кто любит подлиннее:
1 |
$ tail -follow=name -retry lyrics-AA-Tucker.txt |
Если у вас старая система без inotify, можно на худой конец ускорить работу использованием псевдонима, изменив интервал ожидания по умолчанию с 1 на 0,1 секунды:
1 |
$ alias tail=‘tail-s.r |
В принципе, новая система inotify не только экономит ресурсы системы, но и значительно ускоряет работу. Мы оставим ее применение вашему воображению, но легко видеть, что Тейл теперь является подходящим инструментом для таких вещей, как видеоигры и крупномасштабные многопользовательские базы данных, где каждый бит задержки раньше подвесил бы систему. И в конечном итоге это переосмысление основных утилит, которые хотели бы иметь авторы оригинала UNIX.