Як використовувати команди cat and tac Linux

Команди cat і tac відображають вміст текстових файлів, але в них є більше, ніж здається на перший погляд. Зануртеся трохи глибше і дізнайтеся кілька продуктивних прийомів командного рядка Linux.

Це дві прості маленькі команди, які часто відкидають як такі, що надто прості, щоб мати реальну користь. Але як тільки ви дізнаєтеся, як ви можете їх використовувати, ви побачите, що вони цілком здатні виконувати свою частку важкої роботи, коли справа доходить до роботи з файлами.

Команда кішки

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

Свого часу — ще в епоху комутованого доступу модем— двійкові файли часто розбивалися на кілька менших файлів, щоб полегшити завантаження. Замість того, щоб завантажувати один великий файл, ви відтягували кожен менший файл. Якщо один файл не завантажується належним чином, ви просто знову отримаєте цей файл.

Звичайно, тоді вам знадобився спосіб відновити колекцію менших файлів назад в єдиний робочий двійковий файл. Цей процес отримав назву конкатенації. І ось тут з’явився кіт і звідки він отримав свою назву.

Завдяки широкосмуговому та оптоволоконному з’єднанню ця особлива потреба зникла — так само, як скрипливі звуки комутованого зв’язку — то що залишилося робити коту сьогодні? Насправді досить багато.

Відображення текстового файлу

Щоб кот перерахував вміст текстового файлу у вікно терміналу, скористайтеся такою командою.

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

cat poem1.txt

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

Це лише половина відомого вірша. Де решта? Тут є ще один файл, який називається poem2.txt. Ми можемо зробити cat список вмісту кількох файлів за допомогою однієї команди. Все, що нам потрібно зробити, це перерахувати файли по порядку в командному рядку.

cat poem1.txt poem2.txt

Це виглядає краще; ми маємо цілий вірш.

Використання кішки З менше

Вірш є весь, але він пролетів повз вікно занадто швидко, щоб прочитати перші кілька віршів. Ми можемо передавати вихідні дані від cat у менші та прокручувати текст у власному темпі.

cat poem1.txt poem2.txt | less

Тепер ми можемо рухатися назад і вперед по тексту в одному потоці, навіть якщо він міститься в двох окремих текстових файлах.

  Як грати в The Room на Linux

Нумерація рядків у файлі

Ми можемо запропонувати коту номер рядків у файлі, як він відображається. Для цього ми використовуємо параметр -n (число).

cat -n poem1.txt

Рядки нумеруються так, як вони відображаються у вікні терміналу.

Не нумеруйте порожні рядки

Нам вдалося пронумерувати рядки по котику, але підраховуються і порожні рядки між віршами. Щоб рядки тексту були пронумеровані, але щоб ігнорувати порожні рядки, використовуйте параметр -b (число-непусто).

cat -b poem1.txt

Тепер рядки тексту пронумеровані, а пропускні рядки пропущені.

Не показуйте кілька порожніх рядків

Якщо у файлі є розділи послідовних порожніх рядків, ми можемо попросити cat ігнорувати всі, крім одного порожнього рядка. Подивіться на цей файл.

Наступна команда змусить cat відображати лише один порожній рядок з кожної групи порожніх рядків. Для цього нам потрібна опція -s (squeeze-blank).

cat -s poem1.txt

Це жодним чином не впливає на вміст файлу; він просто змінює спосіб відображення файлу cat.

Вкладки дисплея

Якщо ви хочете дізнатися, чи є пробіли спричинені пробілами чи табуляціями, ви можете дізнатися, використовуючи параметр -T (показати вкладки).

cat -T poem1.txt

Вкладки представлені символами «^I».

Відображення кінців рядків

Ви можете перевірити наявність пробілів у кінці за допомогою параметра -E (show-ends).

cat -E poem1.txt

Кінці рядків позначаються символом «$».

Конкатенація файлів

Немає сенсу зберігати вірш у двох файлах, по одній половині в кожному. Давайте об’єднаємо їх разом і створимо новий файл з усім віршем.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt > jabberwocky.txt у вікні терміналу” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Використовуємо cat, щоб перевірити наш новий файл:</p>
<pre>cat jabberwocky.txt</pre > <p><img loading=

Наш новий файл містить вміст двох інших файлів.

Додавання тексту до існуючого файлу

Це краще, але насправді це не весь вірш. Останній куплет відсутній. Останній вірш у Jabberwocky такий самий, як і перший куплет.

Якщо у нас є перший вірш у файлі, ми можемо додати його в нижню частину файлу jabberwocky.txt, і ми отримаємо повний вірш.

У цій наступній команді ми повинні використовувати >>, а не просто >. Якщо ми використовуємо один > ми перезапишемо jabberwocky.txt. Ми не хочемо цього робити. Ми хочемо додати текст внизу.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt у вікні терміналу” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Давайте перевіримо вміст файлу jabberwocky.txt:</p>
<pre>cat jabberwocky.txt< /pre> <p><img loading=

І, нарешті, всі частини вірша разом.

Перенаправлення stdin

Ви можете переспрямувати введення з клавіатури у файл за допомогою cat. Все, що ви вводите, переспрямовується у файл, доки ви не натиснете Ctrl+D. Зауважте, що ми використовуємо одиночний >, оскільки хочемо створити файл (або перезаписати його, якщо він існує).

cat > my_poem.txt

cat > my_poem.txt у вікні терміналу” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Ми можемо почати вводити текст, щойно видамо команду.  Ми натиснули Ctrl+D, коли закінчили.  Потім ми можемо перевірити вміст нового файлу за допомогою:</p>
<pre>cat my-poem.txt</pre>
<p><img loading=

Цей звук схожий на далеку турбіну, ймовірно, Льюїс Керрол, який обертається у своїй могилі на великій швидкості.

Tac Command

tac подібний до cat, але містить список вмісту файлів у зворотному порядку.

Давайте подивимося, що:

tac my_poem.txt

І файл відображається у вікні терміналу в зворотному порядку. У цьому випадку це не впливає на його літературні достоїнства.

Використання tac З stdin

Використання tac без імені файлу призведе до того, що він буде працювати з введенням з клавіатури. Натискання Ctrl+D зупинить фазу введення, і tac відобразить у зворотному порядку все, що ви ввели.

tac

При натисканні Ctrl+D введення змінюється на протилежне і відображається у вікні терміналу.

Використання tac з файлами журналу

Чи може tac зробити щось корисне, окрім низькосортних салонних прийомів? Так, можна. Багато файлів журналів додають свої нові записи в нижній частині файлу. Використовуючи tac (і, як не зрозуміло, голову), ми можемо ввести останній запис у вікно терміналу.

Ми використовуємо tac, щоб перерахувати файл системного журналу в зворотному порядку і передати його в head. Вказуючи head друкувати лише перший рядок, який він отримує (який завдяки tac є останнім рядком у файлі), ми бачимо останній запис у файлі системного журналу.

tac /var/log/syslog | head -1

head друкує останній запис із файлу системного журналу, а потім виходить.

Зверніть увагу, що голова друкує лише один рядок — як ми і просили — але рядок настільки довгий, що обертається двічі. Тому він виглядає як три рядки виводу у вікні терміналу.

Використання tac з текстовими записами

Останній трюк у рукаві — краса.

Зазвичай tac працює з текстовими файлами, проходячи через них рядок за рядком, знизу вгору. Рядок — це послідовність символів, що закінчується символом нового рядка. Але ми можемо наказати tac працювати з іншими роздільниками. Це дозволяє нам розглядати «шматки» даних у текстовому файлі як записи даних.

Скажімо, у нас є файл журналу з якоїсь програми, який нам потрібно переглянути або проаналізувати. Давайте подивимося на його формат з меншою кількістю.

less logfile.dat

Як бачимо, у файлі є повторюваний формат. Існують послідовності з трьох рядків шістнадцятковий цінності. Кожен набір із трьох шістнадцяткових рядків має рядок мітки, який починається «=SEQ», за яким слідує послідовність цифр.

Якщо ми прокрутимо файл донизу, то побачимо, що цих записів багато. Останній номер 865.

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

Зауважимо, що останні три рядки у файлі починаються з шістнадцяткових значень 93, E7 та B8 у такому порядку.

Давайте використаємо tac, щоб перевернути файл. Це дуже довгий файл, тому ми поділимо його на менший.

tac logfile.dat | less

Це повертає файл назад, але це не той результат, який ми хочемо. Ми хочемо, щоб файл був зворотним, але рядки в кожному записі даних мають бути в початковому порядку.

Раніше ми записали, що останні три рядки у файлі починаються з шістнадцяткових значень 93, E7 і B8 в такому порядку. Порядок цих рядків був зворотним. Крім того, рядки «=SEQ» тепер знаходяться під кожним набором із трьох шістнадцяткових рядків.

так на допомогу.

tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less

Давайте розберемо це.

Параметр -s (роздільник) повідомляє tac, що ми хочемо використовувати як роздільник між нашими записами. Він наказує tac не використовувати свій звичайний символ нового рядка, а замість цього використовувати наш роздільник.

Параметр -r (регулярний вираз) вказує tac розглядати рядок роздільника як a регулярний вираз.

Параметр -b (перед) змушує tac відображати роздільник перед кожним записом, а не після нього (що є звичайним положенням його роздільника за замовчуванням, символу нового рядка).

Рядок -s (роздільник) ^=SEQ.+[0-9]+*$ розшифровується наступним чином:

Символ ^ позначає початок рядка. За цим слідує =SEQ.+[0-9]+*$. Це доручає tac шукати кожне поява «=SEQ». на початку рядка, за яким слідує будь-яка послідовність цифр (позначена [0-9]), а потім будь-який інший набір символів (позначений *$).

Ми, як завжди, вкладаємо все в менше.

Наш файл тепер представлений у зворотному порядку з кожним рядком мітки «=SEQ» перед трьома рядками шістнадцяткових даних. Три рядки шістнадцяткових значень розташовані в початковому порядку в кожному записі даних.

Ми можемо перевірити це просто. Перше значення перших трьох шістнадцяткових рядків (які були останніми трьома рядками перед зміною файлу) відповідає значенням, які ми записали раніше: 93, E7 і B8, у такому порядку.

Це неабиякий трюк для однорядкового вікна терміналу.

Все має Мету

У світі Linux навіть найпростіші, здавалося б, команди та утиліти можуть мати дивовижні та потужні властивості.

Філософія дизайну простих утиліт які добре роблять одну справу, який легко взаємодіє з іншими утилітами, викликав деякі дивні маленькі команди, такі як tac. На перший погляд це здається трохи дивним. Але коли ви заглядаєте під поверхню, з’являється несподівана сила, яку ви можете використати на свою користь.

Або, як каже інша філософія: «Не зневажайте змією за те, що вона не має рогів, бо хто скаже, що вона не стане драконом?»