Як використовувати команду tail в Linux

Команда Linux `tail` використовується для виведення даних із кінця файлу. Вона здатна відображати оновлення, що додаються до файлу, в реальному часі. Розглянемо детальніше її можливості.

Чи втратила актуальність команда `tail` з приходом systemd?

Команда `tail` виводить інформацію з останньої частини файлу. Зважаючи на те, що нові дані зазвичай записуються в кінець, `tail` дозволяє швидко переглянути останні додані рядки. Крім того, вона може відстежувати файл, показуючи кожне нове текстове доповнення в міру його появи. Це робить її надзвичайно корисною для моніторингу лог-файлів.

В багатьох сучасних дистрибутивах Linux використовується systemd як менеджер служб. Systemd є процесом з ідентифікатором процесу 1 та батьківським процесом для всіх інших. Раніше цю функцію виконувала система ініціалізації init.

З переходом на systemd, формат файлів системного журналу змінився. Замість звичайних текстових файлів, вони записуються у двійковому форматі. Для читання цих файлів журналу слід використовувати утиліту `journalctl`. Команда `tail` працює зі звичайними текстовими файлами і не може обробляти двійкові. Чи означає це, що `tail` більше не є корисною? Ні, вона все ще має своє застосування.

Команда `tail` є не тільки інструментом для відстеження оновлень в реальному часі. Багато файлів журналів, особливо створених різними програмами, все ще залишаються у форматі звичайного тексту. Тому `tail` не втратила своєї актуальності.

Як використовувати `tail`

Щоб переглянути останні десять рядків файлу, вкажіть його ім’я після команди `tail`. Для демонстрації використовуються файли зі списками відсортованих слів, кожен рядок пронумерований для зручності.

tail word-list.txt

Щоб вивести іншу кількість рядків, скористайтеся параметром `-n` (кількість рядків):

tail -n 15 word-list.txt

Можна опустити `-n` та використовувати дефіс `-` з числом. Важливо, щоб між ними не було пробілів. Хоча це вважається застарілим форматом команди, вона все ще є на сторінці man та працює:

tail -12 word-list.txt

Робота з декількома файлами

Можна використовувати `tail` одночасно з кількома файлами. Просто перерахуйте їхні імена в командному рядку:

tail -n 4 list-1.txt list-2.txt list-3.txt

Для кожного файлу виводиться невеликий заголовок, щоб було зрозуміло, до якого саме файлу належать рядки.

Відображення рядків з початку файлу

За допомогою модифікатора `+` (лічильник від початку) `tail` може виводити рядки, починаючи з вказаного номера. Якщо файл дуже великий, а вказаний номер рядка близький до початку, вивід може бути значним. В такому випадку доцільно перенаправити вивід `tail` до `less`.

tail +440 list-1.txt

Текст можна переглядати за допомогою керуючої сторінки тексту.

Оскільки в цьому файлі 20 445 рядків, наведена команда еквівалентна використанню параметра `-6`:

tail +20440 list-1.txt

Використання байтів з `tail`

Замість рядків `tail` може працювати зі зміщенням у байтах за допомогою параметра `-c` (байти). Це корисно, якщо текстовий файл має записи фіксованого розміру. Важливо пам’ятати, що символ нового рядка рахується як один байт. Наступна команда виведе останні 93 байти файлу:

tail -c 93 list-2.txt

Параметр `-c` можна поєднати з модифікатором `+` (лічильник від початку), щоб задати зміщення в байтах від початку файлу:

tail -c +351053 list-e.txt

Перенаправлення виводу в `tail`

Раніше вивід команди `tail` був перенаправлений в команду `less`. Також можна перенаправляти вихід інших команд в `tail`.

Для визначення п’яти файлів або папок з найдавнішим часом модифікації, використовуйте параметр `-t` (сортування за часом модифікації) з командою `ls`, а результат перенаправте в `tail`.

ls -tl | tail -5

Команда `head` виводить рядки з початку файлу. Її можна використовувати в поєднанні з `tail` для вилучення певного розділу файлу. Наприклад, можна використати `head` для вилучення перших 200 рядків файлу, а потім `tail` для виведення останніх десяти рядків з цього набору. Це дозволить отримати рядки з 191 по 200:

head -n 200 list-1.txt | tail -10

Ця команда виведе 5 процесів, які використовують найбільше пам’яті.

ps aux | sort -nk +4 | tail -5

Розглянемо детальніше цю команду.

Команда `ps` показує інформацію про запущені процеси. Використовуються наступні параметри:

  • `a`: показати всі процеси, а не тільки поточного користувача.
  • `u`: вивести інформацію, орієнтовану на користувача.
  • `x`: показати всі процеси, включно з тими, що не виконуються в межах TTY.

Команда `sort` сортує вивід `ps`. Параметри сортування:

  • `n`: сортувати за числовим значенням.
  • `k +4`: сортувати за четвертим стовпчиком.

Команда `tail -5` виводить останні п’ять рядків відсортованого виводу, тобто 5 процесів з найбільшим споживанням пам’яті.

Відстеження файлів в реальному часі

`tail` дозволяє легко відстежувати додавання нового тексту до файлу (зазвичай, лог-файлу). Вкажіть ім’я файлу та опцію `-f` (follow):

tail -f geek-1.log

При додаванні нових записів до лог-файлу, `tail` буде оновлювати свій вивід в терміналі.

Вивід можна уточнити, відфільтрувавши лише ті рядки, які містять певне слово. Тут `grep` використовується для виведення рядків, що містять слово “середній”:

tail -f geek-1.log | grep average

Для відстеження змін у кількох файлах, перерахуйте їхні імена в командному рядку:

tail -f -n 5 geek-1.log geek-2.log

Кожен запис позначається заголовком, що вказує, з якого файлу він надійшов.

Відображення оновлюється при додаванні нових записів. Щоб вказати інтервал оновлення, використовуйте параметр `-s` (інтервал сну). Наприклад, команда `tail` чекатиме 5 секунд між перевірками файлів:

tail -f -s 5 geek-1.log

Відображення файлу оновлюється кожні 5 секунд.

При відстеженні змін у кількох файлах, можна приховати заголовки, що вказують на джерело тексту. Використайте для цього параметр `-q` (тихий):

tail -f -q geek-1.log geek-2.log

Результати з файлів відображаються як безперервний потік тексту. Без жодних ідентифікаторів файлів.

`tail` все ще потрібна

Незважаючи на те, що доступ до файлів системного журналу тепер здійснюється за допомогою `journalctl`, `tail` все ще має широкі можливості. Особливо це стосується використання її в поєднанні з іншими командами, через перенаправлення виводу.

Systemd змінив ландшафт, але традиційні утиліти, що відповідають філософії Unix (робити одну справу добре), все ще є актуальними.