Comenzile cat și tac afișează conținutul fișierelor text, dar sunt mai multe în ele decât se vede. Aflați puțin mai adânc și învățați câteva trucuri productive pentru linia de comandă Linux.
Acestea sunt două comenzi mici simple, adesea respinse ca fiind doar atât – prea simple pentru a fi de vreo folos real. Dar odată ce cunoașteți diferitele moduri în care le puteți utiliza, veți vedea că sunt perfect capabile să-și facă partea echitabilă din munca grea atunci când vine vorba de lucrul cu fișiere.
Cuprins
Comanda pisicii
pisica este obișnuită examinați conținutul fișierelor text, și pentru a uni părți ale fișierelor împreună pentru a forma un fișier mai mare.
La un moment dat — în epoca dial-up-ului modem— fișierele binare au fost adesea împărțite în mai multe fișiere mai mici pentru a facilita descărcarea. În loc să descărcați un fișier mare, ați retras fiecare fișier mai mic. Dacă un singur fișier nu a reușit să se descarce corect, veți prelua acel fișier din nou.
Desigur, aveai nevoie de o modalitate de a reconstitui colecția de fișiere mai mici înapoi într-un singur fișier binar de lucru. Acest proces a fost numit concatenare. Și de aici a intrat pisica și de unde își trage numele.
Conexiunile în bandă largă și fibră au făcut ca această nevoie specială să se estompeze – la fel ca sunetele zguduitoare ale apelurilor telefonice – așa că ce mai rămâne pentru pisica azi? Destul de multe de fapt.
Afișarea unui fișier text
Pentru ca cat să listeze conținutul unui fișier text într-o fereastră de terminal, utilizați următoarea comandă.
Asigurați-vă că fișierul este un fișier text. Dacă încercați să enumerați conținutul unui fișier binar în fereastra terminalului, rezultatele vor fi imprevizibile. S-ar putea să ajungeți cu o sesiune de terminal blocată sau mai rău.
cat poem1.txt
Conținutul fișierului poem1.txt este afișat în fereastra terminalului.
Aceasta este doar jumătate din celebrul poem. Unde este restul? Există un alt fișier aici numit poem2.txt. Putem face ca cat să listeze conținutul mai multor fișiere cu o singură comandă. Tot ce trebuie să facem este să listăm fișierele în ordine pe linia de comandă.
cat poem1.txt poem2.txt
Asta arată mai bine; avem întreaga poezie acum.
Folosind pisica cu mai puțin
Poezia este acolo, dar a trecut pe lângă fereastră prea repede pentru a citi primele versuri. Putem transfera rezultatul de la cat în less și derulăm în jos prin text în ritmul nostru.
cat poem1.txt poem2.txt | less
Acum ne putem deplasa înapoi și înainte prin text într-un singur flux, chiar dacă este păstrat în două fișiere text separate.
Numerotarea liniilor dintr-un fișier
Putem avea pisica să numere liniile din fișier așa cum este afișat. Pentru a face acest lucru, folosim opțiunea -n (număr).
cat -n poem1.txt
Liniile sunt numerotate așa cum sunt afișate în fereastra terminalului.
Nu numerota linii goale
Am reușit să avem rândurile numerotate după pisică, dar se numără și rândurile goale dintre versuri. Pentru a avea liniile de text numerotate, dar pentru a ignora liniile goale, utilizați opțiunea -b (număr-nonblank).
cat -b poem1.txt
Acum liniile de text sunt numerotate, iar liniile goale sunt sărite.
Nu afișați mai multe linii goale
Dacă într-un fișier există secțiuni de linii goale consecutive, îi putem cere lui cat să ignore toate liniile goale, cu excepția uneia. Uită-te la acest fișier.
Următoarea comandă va face ca cat să afișeze doar o linie goală din fiecare grup de linii goale. Opțiunea de care avem nevoie pentru a realiza acest lucru este opțiunea -s (squeeze-blank).
cat -s poem1.txt
Acest lucru nu afectează în niciun fel conținutul fișierului; doar schimbă modul în care pisica afișează fișierul.
Afișează filele
Dacă doriți să știți dacă spațiul alb este cauzat de spații sau file, puteți afla folosind opțiunea -T (show-tabs).
cat -T poem1.txt
Filele sunt reprezentate de caracterele „^I”.
Afișarea capetelor de linii
Puteți verifica dacă există spații albe în urmă utilizând opțiunea -E (afișare-termină).
cat -E poem1.txt
Capăturile liniilor sunt reprezentate de caracterul „$”.
Concatenarea fișierelor
Nu are sens să ai o poezie salvată în două fișiere, cu câte o jumătate în fiecare. Să le unim și să facem un nou fișier cu întreaga poezie în el.
cat poem1.txt poem2.txt > jabberwocky.txt
Noul nostru fișier conține conținutul celorlalte două fișiere.
Adăugarea textului la un fișier existent
E mai bine, dar, de fapt, nu este întreaga poezie. Lipsește ultimul vers. Ultimul verset din Jabberwocky este același cu primul vers.
Dacă avem primul vers într-un fișier, îl putem adăuga în partea de jos a fișierului jabberwocky.txt și vom avea poemul complet.
În această următoare comandă, trebuie să folosim >>, nu doar >. Dacă folosim un singur > vom suprascrie jabberwocky.txt. Nu vrem să facem asta. Dorim să atașăm text în partea de jos a acestuia.
cat first_verse.txt >> jabberwocky.txt
Și, în sfârșit, toate părțile poeziei sunt împreună.
Redirecționarea stdin
Puteți redirecționa intrarea de la tastatură într-un fișier folosind cat. Tot ceea ce tastați este redirecționat în fișier până când apăsați Ctrl+D. Rețineți că folosim un singur > deoarece dorim să creăm fișierul (sau să îl suprascriem, dacă există).
cat > my_poem.txt
Putem începe să scriem de îndată ce lansăm comanda. Apăsăm Ctrl+D când am terminat. Apoi putem verifica conținutul noului fișier cu:
cat my-poem.txt
Acel sunet ca o turbină îndepărtată este probabil Lewis Carroll care se învârte în mormântul lui cu viteză mare.
Comanda tac
tac este similar cu cat, dar listează conținutul fișierelor în ordine inversă.
Sa vedem ca:
tac my_poem.txt
Și fișierul este listat în fereastra terminalului în ordine inversă. În acest caz, nu are niciun efect asupra meritelor sale literare.
Utilizarea tac Cu stdin
Utilizarea tac fără un nume de fișier va face ca acesta să funcționeze pe intrarea de la tastatură. Atingerea Ctrl+D va opri faza de introducere, iar tac va lista în ordine inversă orice ați introdus.
tac
Când este apăsat Ctrl+D, intrarea este inversată și afișată în fereastra terminalului.
Utilizarea tac cu fișiere jurnal
În afară de trucurile de salon de calitate scăzută, tac poate face ceva util? Da, se poate. Multe fișiere jurnal atașează cele mai noi intrări în partea de jos a fișierului. Folosind tac (și, contraintuitiv, head) putem deschide ultima intrare în fereastra terminalului.
Folosim tac pentru a enumera fișierul syslog în sens invers și îl trimitem în cap. Spunendu-i lui head să imprime doar prima linie pe care o primește (care datorită tac este ultima linie din fișier), vedem cea mai recentă intrare în fișierul syslog.
tac /var/log/syslog | head -1
head tipărește cea mai recentă intrare din fișierul syslog și apoi iese.
Rețineți că capul imprimă doar o linie, așa cum am solicitat, dar linia este atât de lungă încât se înfășoară de două ori. De aceea, arată ca trei linii de ieșire în fereastra terminalului.
Utilizarea tac cu înregistrări text
Ultimul truc tac pe care îl are în mânecă este o frumusețe.
De obicei, tac operează pe fișiere text, parcurgându-și linie cu linie, de jos în sus. O linie este o secvență de caractere terminată cu un caracter de linie nouă. Dar putem spune lui tac să lucreze cu alți delimitatori. Acest lucru ne permite să tratăm „bucăți” de date din fișierul text ca înregistrări de date.
Să presupunem că avem un fișier jurnal de la un program pe care trebuie să îl revizuim sau să îl analizăm. Să ne uităm la formatul său cu mai puțin.
less logfile.dat
După cum putem vedea, fișierul are un format care se repetă. Există secvențe de trei linii de hexazecimal valorile. Fiecare set de trei linii hexazecimale are o linie de etichetă care începe „=SEQ”, urmată de o secvență de cifre.
Dacă derulăm în partea de jos a fișierului, putem vedea că există o mulțime de aceste înregistrări. Cel final este numerotat 865.
Să presupunem că, din orice motiv, trebuie să lucrăm prin acest fișier în ordine inversă, înregistrare de date cu înregistrare de date. Ordinea liniilor a celor trei linii hexazecimale din fiecare înregistrare de date trebuie păstrată.
Vom nota că ultimele trei linii din fișier încep cu valorile hexazecimale 93, E7 și B8, în această ordine.
Să folosim tac pentru a inversa fișierul. Este un fișier foarte lung, așa că îl vom concentra în mai puțin.
tac logfile.dat | less
Asta inversează fișierul, dar nu este rezultatul pe care îl dorim. Dorim ca fișierul să fie inversat, dar liniile din fiecare înregistrare de date trebuie să fie în ordinea inițială.
Am înregistrat mai devreme că ultimele trei linii din fișier încep cu valorile hexazecimale 93, E7 și B8, în această ordine. Ordinea acestor linii a fost inversată. De asemenea, liniile „=SEQ” sunt acum sub fiecare set de trei linii hexazecimale.
tac la salvare.
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less
Să descompun asta.
Opțiunea -s (separator) informează tac ce dorim să folosim ca delimitator între înregistrările noastre. Îi spune lui tac să nu folosească caracterul său obișnuit nou linie, ci să folosească separatorul nostru.
Opțiunea -r (regex) îi spune tac să trateze șirul separator ca a expresie uzuala.
Opțiunea -b (înainte) face ca tac să afișeze separatorul înaintea fiecărei înregistrări în loc de după aceasta (care este poziția obișnuită a separatorului său implicit, caracterul newline).
Șirul -s (separator) ^=SEQ.+[0-9]+*$ este descifrat după cum urmează:
Caracterul ^ reprezintă începutul liniei. Aceasta este urmată de =SEQ.+[0-9]+*$. Aceasta îi indică tac să caute fiecare apariție a „=SEQ”. la începutul unei linii, urmată de orice succesiune de cifre (indicată de [0-9]), și urmat de orice alt set de caractere (indicat prin *$).
Ținem întregul lot în mai puțin, ca de obicei.
Fișierul nostru este acum prezentat în ordine inversă cu fiecare linie de etichetă „=SEQ” listată înaintea celor trei linii de date hexazecimale. Cele trei linii de valori hexazecimale sunt în ordinea lor originală în fiecare înregistrare de date.
Putem verifica acest lucru simplu. Prima valoare a primelor trei linii de hexazecimal (care erau ultimele trei linii înainte ca fișierul să fie inversat) se potrivește cu valorile pe care le-am înregistrat mai devreme: 93, E7 și B8, în această ordine.
Acesta este destul de un truc pentru o fereastră terminală cu o singură linie.
Totul Are un Scop
În lumea Linux, chiar și comenzile și utilitățile aparent cele mai simple pot avea proprietăți surprinzătoare și puternice.
Filosofia de proiectare a utilităților simple care fac un lucru bine, și care interacționează ușor cu alte utilitare, a dat naștere unor comenzi mici ciudate, cum ar fi tac. La prima vedere, pare a fi o ciudățenie. Dar când privești sub suprafață, există o putere neașteptată pe care o poți folosi în avantajul tău.
Sau, așa cum spune o altă filozofie, „Nu disprețui șarpele pentru că nu are coarne, căci cine să spună că nu va deveni balaur?”