Команди `cat` і `tac` використовуються для перегляду вмісту текстових файлів, але їх можливості набагато ширші, ніж здається на перший погляд. Давайте глибше дослідимо ці інструменти командного рядка Linux і виявимо їхню продуктивність.
Ці дві прості утиліти часто недооцінюють через їхню видиму простоту. Проте, ознайомившись з їхнім потенціалом, ви переконаєтеся, що вони здатні виконувати значну частину роботи при обробці файлів.
Команда `cat`
Основна функція `cat` – це відображення вмісту текстових файлів, а також об’єднання декількох файлів в один.
У минулому, за часів модемного з’єднання, великі файли часто розбивалися на менші частини для спрощення завантаження. Це давало змогу завантажувати кожен фрагмент окремо і у разі невдачі повторно завантажити лише пошкоджений фрагмент, замість усього файлу.
Звичайно, після завантаження, виникала потреба у відновленні оригінального файлу з його фрагментів. Цей процес об’єднання отримав назву “конкатенація”. Саме тут на сцену вийшла команда `cat` і отримала своє ім’я.
Завдяки поширеному широкосмуговому та оптоволоконному інтернету, ця потреба зникла. Тож чим сьогодні займається `cat`? Насправді, досить багатьма речами.
Відображення текстового файлу
Щоб переглянути вміст текстового файлу в терміналі, скористайтеся наступною командою:
cat poem1.txt
Вміст файлу `poem1.txt` буде відображено в терміналі.
Це тільки початок відомого вірша. Де ж його продовження? Воно зберігається в файлі `poem2.txt`. Команда `cat` може відобразити вміст декількох файлів одночасно. Для цього необхідно просто вказати всі файли в командному рядку:
cat poem1.txt poem2.txt
Тепер вірш відображається повністю.
Використання `cat` з `less`
Вірш швидко промайнув у терміналі, і перші рядки було важко прочитати. Щоб переглядати текст у зручному темпі, можна передати вивід `cat` в команду `less`:
cat poem1.txt poem2.txt | less
Тепер можна переміщатися по тексту, навіть якщо він розподілений на два окремі файли.
Нумерація рядків
Команда `cat` також може нумерувати рядки. Для цього використовується параметр `-n` (number):
cat -n poem1.txt
Рядки тексту відображаються разом з їхніми номерами.
Пропуск порожніх рядків при нумерації
При нумерації рядків, порожні рядки між віршами також отримують номери. Щоб цього уникнути і нумерувати лише рядки з текстом, використовуйте параметр `-b` (number-nonblank):
cat -b poem1.txt
Тепер пронумеровані тільки рядки з текстом.
Згортання кількох порожніх рядків в один
Якщо файл містить кілька послідовних порожніх рядків, `cat` може згорнути їх в один. Для цього використовуйте параметр `-s` (squeeze-blank):
cat -s poem1.txt
Цей параметр не змінює вміст файлу, а лише спосіб його відображення.
Показ символів табуляції
Щоб визначити, чи є відступи у файлі пробілами чи символами табуляції, можна скористатися параметром `-T` (show-tabs):
cat -T poem1.txt
Символи табуляції будуть відображені як `^I`.
Показ кінців рядків
Для перевірки наявності пробілів в кінці рядка, можна використати параметр `-E` (show-ends):
cat -E poem1.txt
Кінці рядків будуть позначені символом `$`.
Об’єднання файлів
Зберігати вірш у двох окремих файлах незручно. Об’єднаємо їх в один файл:
cat poem1.txt poem2.txt > jabberwocky.txt
Перевіримо новий файл за допомогою `cat`:
cat jabberwocky.txt
Новий файл містить вміст двох попередніх.
Додавання тексту до існуючого файлу
Проте вірш все ще не повний, останньої строфи не вистачає. Оскільки перша строфа вірша є такою ж, як і остання, додамо її в кінець файлу `jabberwocky.txt`.
Щоб додати текст в кінець файлу, а не перезаписати його, необхідно використовувати оператор `>>` замість `>`.
cat first_verse.txt >> jabberwocky.txt
Перевіримо вміст файлу `jabberwocky.txt`:
cat jabberwocky.txt
Тепер вірш повний.
Перенаправлення stdin
За допомогою `cat` можна перенаправити введений з клавіатури текст у файл. Для цього використовуйте оператор `>` і вкажіть ім’я нового файлу. Вводьте текст, поки не натиснете `Ctrl+D`.
cat > my_poem.txt
Після введення команди можна вводити текст. Після завершення, натисніть `Ctrl+D`. Потім перевірте вміст файлу:
cat my-poem.txt
Напевно, Льюїс Керрол перевертається в труні, почувши таке.
Команда `tac`
Команда `tac` схожа на `cat`, але відображає вміст файлів у зворотному порядку.
Давайте подивимося, як це працює:
tac my_poem.txt
Файл відображається у зворотному порядку.
Використання `tac` з `stdin`
При використанні `tac` без вказання імені файлу, він буде працювати з введенням з клавіатури. Натискання `Ctrl+D` завершить введення і `tac` відобразить введений текст у зворотному порядку.
tac
Після натискання `Ctrl+D`, введений текст буде відображено в зворотному порядку в терміналі.
Використання `tac` з файлами журналів
Чи може `tac` виконувати щось корисне, окрім дрібних трюків? Так, може. У багатьох файлах журналів нові записи додаються в кінець файлу. За допомогою `tac` (і `head`), можна відобразити останній запис у файлі.
Для цього використаємо `tac`, щоб переглянути системний журнал у зворотному порядку і передамо його вивід в команду `head`. Вказуючи `head` показати тільки перший рядок, ми відобразимо останній рядок файлу.
tac /var/log/syslog | head -1
`head` відображає останній запис з файлу системного журналу і завершує роботу.
Зверніть увагу, що `head` друкує тільки один рядок, але рядок такий довгий, що він переноситься на наступний рядок в терміналі.
Використання `tac` з текстовими записами
Останній, але не менш важливий трюк `tac`.
Зазвичай `tac` працює з текстовими файлами, обробляючи їх рядок за рядком, знизу вгору. Рядок – це послідовність символів, яка закінчується символом нового рядка. Але можна налаштувати `tac` для роботи з іншими роздільниками. Це дозволяє обробляти “блоки” даних у файлі як окремі записи.
Припустимо, у нас є файл журналу, який потрібно переглянути. Подивимось на його структуру:
less logfile.dat
Файл має повторювану структуру. Існують послідовності з трьох рядків шістнадцяткових значень. Кожен такий блок має мітку, яка починається з `=SEQ`, за якою слідує послідовність цифр.
Прокручуючи файл донизу, бачимо, що таких записів багато. Останній запис має номер 865.
Для зручності, припустимо, потрібно переглянути цей файл у зворотному порядку, зберігаючи порядок рядків у кожному записі.
Зауважимо, що останні три рядки у файлі починаються зі значень 93, E7 та B8 у такому порядку.
Спробуємо `tac` для перевертання файлу. Оскільки файл великий, виведемо його в `less`:
tac logfile.dat | less
Це перевернуло файл, але не так, як ми хотіли. Ми хочемо перевернути послідовність записів, але не рядки всередині них.
Раніше ми зауважили, що останні три рядки файлу починаються зі значень 93, E7 та B8. Порядок цих рядків було інвертовано. Крім того, рядки `=SEQ` тепер знаходяться під відповідними їм записами.
Тут нам допоможе `tac` з додатковими параметрами:
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less
Розберемо цю команду по частинах:
- Параметр `-s` (separator) вказує `tac`, який роздільник використовувати між записами.
Він наказує tac використовувати наш роздільник замість звичайного символу нового рядка. - Параметр `-r` (regular expression) вказує `tac` розглядати рядок роздільника як регулярний вираз.
- Параметр `-b` (before) змушує tac відображати роздільник перед кожним записом, а не після нього.
- Рядок `-s ^=SEQ.+[0-9]+*$` наказує `tac` шукати кожен рядок, що починається з `=SEQ`, за яким слідує будь-яка послідовність цифр та будь-яка інша послідовність символів.
Як завжди, результат ми виводимо в `less`.
Тепер наш файл відображається у зворотному порядку, з рядками міток `=SEQ` перед кожною групою з трьох шістнадцяткових рядків. Порядок шістнадцяткових рядків всередині кожного запису збережений.
Можемо перевірити, що перші три шістнадцяткових значення (які були останніми трьома рядками перед трансформацією файлу) збігаються з значеннями, записаними нами раніше: 93, E7 і B8, у тому ж порядку.
Це досить потужний трюк для командного рядка.
У всього є мета
У світі Linux навіть найпростіші, здавалося б, команди та утиліти можуть мати дивовижні і потужні можливості.
Філософія дизайну простих утиліт, що добре виконують одну задачу і взаємодіють з іншими утилітами, породила такі дивні маленькі команди як `tac`. На перший погляд, це може здатися дивним. Але якщо зазирнути глибше, можна знайти неочікувану силу, яку можна використати собі на користь.
Або, як говорить інша філософія: “Не зневажайте змію за те, що вона не має рогів, бо хто скаже, що вона не стане драконом?”