Команде cat
и tac
су алати за преглед садржаја текстуалних фајлова, али њихова функционалност сеже много дубље од обичног приказивања текста. Задубимо се у њихове могућности и откријмо како ове наизглед једноставне команде могу бити веома корисне у радном окружењу Линук система.
Ове команде често се потцењују и сматрају превише једноставним да би биле од веће користи. Међутим, када се упознате са њиховим различитим начинима примене, схватићете да су итекако способне да обављају сложене задатке у вези са манипулацијом фајловима.
Команда cat
Команда cat
првенствено се користи за приказ садржаја текстуалних фајлова, као и за спајање више фајлова у један.
У прошлости, у време dial-up модема, бинарни фајлови су се често делили на мање делове како би се олакшао пренос. Уместо да се преузима један велики фајл, корисници су преузимали сваки мањи део посебно. У случају да је преузимање једног дела било неуспешно, било је потребно поново преузети само тај део.
Наравно, касније је био потребан начин да се ови мањи делови поново споје у један употребљив бинарни фајл. Овај процес је био познат као спајање, и ту је команда cat
одиграла своју улогу и добила име.
Са развојем широкопојасних и оптичких веза, ова потреба је изгубила на значају. Међутим, шта данас можемо учинити са командом cat
? Испоставља се, много тога.
Приказ садржаја текстуалног фајла
Да бисте видели садржај текстуалног фајла у терминалу, користите следећу команду:
Важно је напоменути да фајл мора бити текстуални. Ако покушате приказати садржај бинарног фајла, резултат може бити непредвидљив, чак може доћи до закључавања терминала.
cat pesma1.txt
Садржај фајла pesma1.txt
биће приказан у терминалу.
Ово је само један део познате песме. Где је остатак? Постоји и фајл pesma2.txt
. Командом cat
можемо приказати садржај више фајлова истовремено. Једноставно наводимо фајлове по реду у командној линији.
cat pesma1.txt pesma2.txt
Сада је боље, имамо целу песму.
Коришћење cat
са less
Песма се пребрзо исписала, тако да нисмо успели прочитати прве стихове. Можемо проследити излаз команде cat
команди less
како бисмо могли читати текст сопственим темпом.
cat pesma1.txt pesma2.txt | less
Сада можемо прегледати цео текст, чак иако потиче из два различита фајла.
Нумерисање линија у фајлу
Команда cat
може нумерисати линије у фајлу приликом приказа. Да бисмо то урадили, користимо опцију -n
(број).
cat -n pesma1.txt
Све линије биће нумерисане.
Игнорисање празних линија при нумерисању
У претходном примеру, све линије, укључујући и празне, биле су нумерисане. Да бисмо нумерисали само линије текста и прескочили празне, користимо опцију -b
(број-непразне).
cat -b pesma1.txt
Сада су само линије текста нумерисане, док су празне линије прескочене.
Приказ једне празне линије
Ако се у фајлу налази више узастопних празних линија, можемо наложити команди cat
да прикаже само једну. Погледајмо следећи фајл.
Команда у наставку ће приказати само једну празну линију уместо низа празних линија. Користићемо опцију -s
(сажми-празно).
cat -s pesma1.txt
Ово неће променити садржај фајла, већ само начин на који га cat
приказује.
Приказ знакова за табулацију
Ако желите да сазнате да ли је празан простор узрокован размацима или табулаторима, то можете учинити помоћу опције -T
(прикажи-табулаторе).
cat -T pesma1.txt
Табулатори су представљени знацима „^I“.
Приказ знакова краја линије
Можете проверити да ли има празних места на крају линије користећи опцију -E
(прикажи-крајеве).
cat -E pesma1.txt
Крај сваке линије биће представљен знаком „$“.
Спајање фајлова
Нема смисла држати песму у два фајла, са по једном половином у сваком. Хајде да их спојимо у један нови фајл који ће садржавати целу песму.
cat pesma1.txt pesma2.txt > džabervok.txt
Користимо команду cat
да проверимо садржај новог фајла:
cat džabervok.txt
Нови фајл садржи садржај оба претходна фајла.
Додавање текста у постојећи фајл
Ово је боље, али у ствари, не ради се о целој песми. Недостаје последњи стих. Последњи стих у „Џабервоку“ је исти као и први.
Ако имамо први стих у посебном фајлу, можемо га додати на крај фајла džabervok.txt
и тако добити целу песму.
У овој следећој команди морамо користити >>
уместо само >
. Ако користимо >
, преписаћемо садржај фајла džabervok.txt
. То не желимо. Желимо додати текст на крај фајла.
cat prvi_stih.txt >> džabervok.txt
Проверимо садржај фајла džabervok.txt
:
cat džabervok.txt
Коначно, сви делови песме су на окупу.
Преусмеравање улаза са тастатуре
Можете преусмерити унос са тастатуре у фајл користећи команду cat
. Све што унесете биће преусмерено у фајл док не притиснете Ctrl+D. Имајте на уму да користимо један >
јер желимо креирати фајл (или га заменити ако већ постоји).
cat > moja_pesma.txt
Можемо почети куцати чим издамо команду. Притиснули смо Ctrl+D кад смо завршили. Сада можемо проверити садржај фајла са:
cat moja_pesma.txt
Тај звук удаљене турбине вероватно је Луис Керол који се окреће у свом гробу великом брзином.
Команда tac
Команда tac
је слична команди cat
, али приказује садржај фајлова обрнутим редоследом.
Да видимо како то изгледа:
tac moja_pesma.txt
Фајл је приказан у терминалу обрнутим редоследом. У овом случају, то не утиче на његов књижевни квалитет.
Коришћење tac
са стандардним улазом
Коришћење команде tac
без имена фајла ће је усмерити да ради на улазу са тастатуре. Притиском на Ctrl+D се завршава фаза уноса, и tac
ће приказати обрнутим редоследом све што сте унели.
tac
Када притиснете Ctrl+D, унос се обрће и приказује у терминалу.
Коришћење tac
са фајловима евиденције
Осим за „трикове“ забављања, може ли команда tac
бити корисна? Да, може. Многи фајлови евиденције додају нове записе на крај фајла. Користећи tac
(и, супротно интуицији, head
) можемо приказати последњи унос у терминалу.
Користимо tac
да прикажемо фајл syslog
у обрнутом смеру, а затим га прослеђујемо команди head
. Говорећи команди head
да штампа само прву линију коју прими (што је захваљујући tac
последња линија у фајлу), видимо најновији унос у фајлу syslog
.
tac /var/log/syslog | head -1
Команда head
штампа најновији унос из фајла syslog
и затим се завршава.
Имајте на уму да команда head
штампа само једну линију, као што смо тражили, али је та линија толико дуга да се прелама у више линија у терминалу. Зато изгледа као да имамо три линије излаза.
Коришћење tac
са текстуалним записима
Последњи трик који команда tac
има у рукаву је посебан.
Обично, команда tac
ради са текстуалним фајловима тако што их обрађује линију по линију, од дна према врху. Линија је низ знакова који се завршава знаком за нови ред. Међутим, можемо рећи команди tac
да ради са другим разграничивачима. Ово нам омогућава да третирамо „комаде“ података у текстуалном фајлу као записе података.
Рецимо да имамо фајл евиденције неке апликације коју треба да прегледамо или анализирамо. Хајде да погледамо његов формат помоћу команде less
.
less datoteka_evidencije.dat
Као што видимо, постоји образац који се понавља. Постоје низови од три линије хексадецималних вредности. Сваки скуп од три хексадецималне линије има линију ознаке која почиње са „=СЕК“, праћеном низом цифара.
Ако скролујемо до дна фајла, видимо да има много ових записа. Последњи је под бројем 865.
Претпоставимо да из неког разлога морамо да обрађујемо овај фајл обрнутим редоследом, запис по запис. Редослед три хексадецималне линије у сваком запису мора бити сачуван.
Приметимо да последње три линије у фајлу почињу хексадецималним вредностима 93, E7 и B8, тим редоследом.
Користимо tac
да обрнемо фајл. Пошто је фајл веома дугачак, проследићемо га команди less
.
tac datoteka_evidencije.dat | less
Ово обрће фајл, али није резултат који желимо. Желимо да се фајл обрне, али редови унутар сваког записа морају бити у оригиналном редоследу.
Раније смо забележили да последње три линије у фајлу почињу хексадецималним вредностима 93, E7 и B8, тим редоследом. Редослед тих линија је обрнут. Такође, линије „=СЕК“ су сада испод сваког скупа од три хексадецималне линије.
tac
нам помаже у овоме.
tac -b -r -s ^=SEQ.+[0-9]+*$ datoteka_evidencije.dat | less
Хајде да ово разложимо.
Опција -s
(сепаратор) обавештава tac
шта желимо да користимо као разграничивач између записа. Говори tac
-у да не користи обичан знак за нови ред, већ да уместо тога користи наш разграничивач.
Опција -r
(регек) говори tac
-у да третира стринг разграничивача као регуларни израз.
Опција -b
(пре) изазива да tac
прикаже разграничивач испред сваког записа, а не иза њега (што је уобичајени положај за подразумевани разграничивач, знак за нови ред).
-s
(сепаратор) стринг ^=СЕК.+[0-9]+*$
се дешифрује на следећи начин:
Знак ^
представља почетак линије. Ово је праћено са =СЕК.+[0-9]+*$
. Ово налаже команди tac
да тражи свако појављивање знака „=СЕК“ на почетку линије, затим било који низ цифара (означен са [0-9]
), а затим било који други низ знакова (означен са *$
).
Све то прослеђујемо команди less
, као и обично.
Наш фајл је сада приказан обрнутим редоследом са сваком линијом ознаке „=СЕК“ која је наведена испред три линије хексадецималних података. Три линије хексадецималних вредности су у свом оригиналном редоследу унутар сваког записа података.
Можемо једноставно проверити ово. Прва вредност прве три линије хексадецимала (које су биле последње три линије пре обртања фајла) одговара вредностима које смо раније забележили: 93, E7 и B8, тим редоследом.
Ово је прави трик за једну линију у терминалу.
Све има своју сврху
У свету Линукс-а, чак и наизглед најједноставније команде и алати могу имати изненађујућа и моћна својства.
Филозофија дизајна једноставних алата <a href=“https://en.wikipedia.org/wiki/Unix_philosophy#Do_One_Thing_and_Do_It_Well