Команда 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 (робити одну справу добре), все ще є актуальними.