Как да използвате командите cat and tac в Linux

Командите cat и tac показват съдържанието на текстови файлове, но в тях има повече, отколкото изглежда. Гмурнете се малко по-дълбоко и научете някои продуктивни трикове за командния ред на Linux.

Това са две прости малки команди, често отхвърляни като точно това – твърде прости, за да бъдат от каквато и да е истинска полза. Но след като разберете различните начини, по които можете да ги използвате, ще видите, че те са напълно способни да изпълнят своя дял от тежката работа, когато става въпрос за работа с файлове.

Командата на котката

котката е свикнала прегледайте съдържанието на текстови файлове, и да обедините части от файлове заедно, за да образувате по-голям файл.

По едно време — обратно в ерата на комутируемото свързване модем— двоичните файлове често бяха разбити на няколко по-малки файла, за да се улесни изтеглянето. Вместо да изтегляте един голям файл, вие изтегляте обратно всеки по-малък файл. Ако един файл не успее да се изтегли правилно, просто ще изтеглите този файл отново.

Разбира се, тогава ви трябваше начин да възстановите колекцията от по-малки файлове обратно в един работен двоичен файл. Този процес се наричаше конкатенация. И това е мястото, където котката дойде и откъде получава името си.

Широколентовите и оптични връзки доведоха до избледняване на тази конкретна нужда – подобно на скърцащи звуци при комутируеми връзки – така че какво остава на котката да прави днес? Всъщност доста.

Показване на текстов файл

За да накарате cat да изброи съдържанието на текстов файл в прозорец на терминал, използвайте следната команда.

Уверете се, че файлът е текстов файл. Ако се опитате да изброите съдържанието на двоичен файл в прозореца на терминала, резултатите ще бъдат непредвидими. Може да се окажете със заключена терминална сесия или по-лошо.

cat poem1.txt

Съдържанието на файла poem1.txt се показва в прозореца на терминала.

Това е само половината от известното стихотворение. Къде е останалото? Тук има друг файл, наречен poem2.txt. Можем да направим cat списък съдържанието на множество файлове с една команда. Всичко, което трябва да направим, е да изброим файловете по ред в командния ред.

cat poem1.txt poem2.txt

Това изглежда по-добре; сега имаме цялото стихотворение.

Използване на котка С по-малко

Стихотворението е всичко там, но то излетя покрай прозореца твърде бързо, за да прочете първите няколко стиха. Можем да пренасочваме изхода от cat към по-малко и да превъртаме надолу през текста със собствено темпо.

cat poem1.txt poem2.txt | less

Вече можем да се движим назад и напред през текста в един поток, въпреки че се съхранява в два отделни текстови файла.

  5-те най-добри плъгини за чат за емпатия за 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 (показване на края).

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, за да изброим syslog файла в обратна посока и да го изведем в главата. Като кажете на head да отпечата само първия ред, който получава (което благодарение на tac е последният ред във файла), виждаме последния запис в syslog файла.

tac /var/log/syslog | head -1

head отпечатва последния запис от syslog файла и след това излиза.

Имайте предвид, че главата отпечатва само един ред — както поискахме — но линията е толкова дълга, че се увива два пъти. Ето защо изглежда като три изходни реда в прозореца на терминала.

Използване на 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 (regex) казва на tac да третира разделителния низ като a регулярен израз.

Опцията -b (before) кара tac да изброява разделителя преди всеки запис, вместо след него (което е обичайната позиция на неговия разделител по подразбиране, символа за нов ред).

Низът -s (разделител) ^=SEQ.+[0-9]+*$ се дешифрира, както следва:

Знакът ^ представлява началото на реда. Това е последвано от =SEQ.+[0-9]+*$. Това инструктира tac да търси всяко появяване на "=SEQ." в началото на ред, последван от произволна последователност от цифри (обозначена с [0-9]) и последван от всеки друг набор от знаци (обозначен с *$).

Прехвърляме цялата партида в по-малко, както обикновено.

Нашият файл вече е представен в обратен ред с всеки ред на етикета „=SEQ“, изброен преди трите реда шестнадесетични данни. Трите реда шестнадесетични стойности са в оригиналния им ред във всеки запис с данни.

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

Това е доста трик за едноредов прозорец на терминал.

Всичко има Предназначение

В света на Linux дори най-простите на пръв поглед команди и помощни програми могат да имат изненадващи и мощни свойства.

Философията на дизайна на простите помощни програми които правят едно нещо добре, и който лесно взаимодейства с други помощни програми, доведе до някои странни малки команди, като tac. На пръв поглед изглежда малко странно. Но когато надникнете под повърхността, има неочаквана сила, която можете да използвате в своя полза.

Или, както казва друга философия: „Не презирайте змията, защото няма рога, защото кой ще каже, че няма да стане дракон?“