Hoe de Linux cat- en tac-opdrachten te gebruiken

Kunst van een terminalvenster op een Linux-desktop
Fatmawati Achmad Zaenuri / Shutterstock.com

De cat en tac commando’s geven de inhoud van tekstbestanden weer, maar er is meer aan de hand dan op het eerste gezicht lijkt. Duik een beetje dieper en leer enkele productieve Linux-opdrachtregeltrucs.

Dit zijn twee simpele commando’s, die vaak afgedaan worden omdat ze te simpel zijn om echt van nut te zijn. Maar als je eenmaal de verschillende manieren kent waarop je ze kunt gebruiken, zul je zien dat ze perfect in staat zijn om een ​​groot deel van het zware werk te doen als het gaat om het werken met bestanden.

Het kattencommando

cat wordt gebruikt om de inhoud van tekstbestanden te onderzoeken en om delen van bestanden samen te voegen om een ​​groter bestand te vormen.

Vroeger – in het tijdperk van de inbelmodem – werden binaire bestanden vaak opgedeeld in verschillende kleinere bestanden om het downloaden te vergemakkelijken. In plaats van één groot bestand te downloaden, trok u elk kleiner bestand terug. Als een enkel bestand niet correct kon worden gedownload, zou u dat ene bestand gewoon opnieuw ophalen.

Natuurlijk had je toen een manier nodig om de verzameling kleinere bestanden weer in het enkele werkende binaire bestand te reconstrueren. Dat proces werd aaneenschakeling genoemd. En dat is waar cat kwam binnen en waar het zijn naam aan ontleent.

Breedband- en glasvezelverbindingen hebben ervoor gezorgd dat die specifieke behoefte vervaagt, net als gierende inbelgeluiden, dus wat blijft er over voor cat te doen vandaag? Best veel eigenlijk.

Een tekstbestand weergeven

Hebben cat de inhoud van een tekstbestand in een terminalvenster weergeven, gebruikt u de volgende opdracht.

Zorg ervoor dat het bestand een tekstbestand is. Als u de inhoud van een binair bestand in het terminalvenster probeert weer te geven, zijn de resultaten onvoorspelbaar. U kunt eindigen met een vergrendelde terminalsessie of erger.

cat poem1.txt

cat poem1.txt in een terminalvenster

De inhoud van het bestand poem1.txt wordt getoond in het terminalvenster.

de inhoud van poem1.txt in een terminalvenster

Dat is slechts de helft van het beroemde gedicht. Waar is de rest? Er is hier nog een bestand met de naam poem2.txt. We kunnen maken cat geef de inhoud van meerdere bestanden weer met één opdracht. Het enige wat we hoeven te doen is de bestanden op volgorde op de opdrachtregel weergeven.

cat poem1.txt poem2.txt

cat poem1.txt poem2.txt in een terminalvenster

Dat ziet er beter uit; we hebben nu het hele gedicht.

inhoud van poem1.txt en poem2.txt in een terminalvenster

Cat gebruiken met minder

Het gedicht is er allemaal, maar het schoot te snel langs het raam om de eerste paar verzen te lezen. We kunnen de output van cat in less en in ons eigen tempo door de tekst bladeren.

cat poem1.txt poem2.txt | less

kat gedicht1.txt gedicht2.txt |  minder in een terminalvenster

We kunnen nu in één stream voor- en achteruit door de tekst bladeren, ook al wordt deze in twee afzonderlijke tekstbestanden bewaard.

inhoud van poem1.txt en poem2.txt in less in een terminalvenster

De regels in een bestand nummeren

We kunnen de regels in het bestand met een kat nummeren zoals het wordt weergegeven. Hiervoor gebruiken we de -n (nummer) optie.

cat -n poem1.txt

cat -n poem1.txt in een terminalvenster

De regels zijn genummerd zoals ze worden weergegeven in het terminalvenster.

inhoud van poem1.txt met genummerde regels in een terminalvenster

Nummer geen lege regels

We zijn erin geslaagd om de regels te nummeren met cat, maar de lege regels tussen de verzen worden ook meegeteld. Om de tekstregels te nummeren maar de lege regels te negeren, gebruikt u de -b (nummer-niet-leeg) optie.

cat -b poem1.txt

cat -b poem1.txt in een terminalvenster

Nu zijn de tekstregels genummerd en worden de lege regels overgeslagen.

genummerde regels die lege l; ines overslaan in een terminalvenster

Laat niet meerdere lege regels zien

Als een bestand secties van opeenvolgende lege regels bevat, kunnen we u vragen cat om alle lege regels op één na te negeren. Kijk naar dit bestand.

inhoud van een bestand met opeenvolgende lege regels in een terminalvenster

Het volgende commando zal veroorzaken cat om slechts één lege regel van elk stel lege regels weer te geven. De optie die we nodig hebben om dit te bereiken is de -s (squeeze-blank) optie.

cat -s poem1.txt

cat -b poem1.txt in een terminalvenster

Dit heeft op geen enkele manier invloed op de inhoud van het bestand; het verandert gewoon de manier cat geeft het bestand weer.

Meerdere lege regels worden genegeerd in een terminalvenster

Tabbladen weergeven

Als u wilt weten of witruimte wordt veroorzaakt door spaties of tabbladen, kunt u dit achterhalen met de -T (show-tabs) optie.

cat -T poem1.txt

cat -T poem1.txt in een terminale weduwe

De tabbladen worden weergegeven door de tekens “^ I”.

inhoud van gedicht1.txt met tabbladen weergegeven in een terminalvenster

De uiteinden van lijnen weergeven

U kunt controleren of er spaties achteraan staan ​​door de -E (show-ends) optie.

cat -E poem1.txt

cat -T poem1.txt in een terminalvenster

De uiteinden van regels worden weergegeven door het teken “$”.

inhoud van gedicht1.txt met regeluiteinden weergegeven in een terminalvenster

Bestanden aaneenschakelen

Het heeft geen zin om een ​​gedicht in twee bestanden op te slaan, met elk een helft. Laten we ons bij hen voegen en een nieuw bestand maken met het hele gedicht erin.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt> jabberwocky.txt in een terminalvenster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>laten we gebruiken <code>cat</code> om ons nieuwe bestand te controleren:</p>
<pre>cat jabberwocky.txt</pre>
<p><img loading=

Ons nieuwe bestand bevat de inhoud van de andere twee bestanden.

inhoud van jabberwocky.tx in een terminalvenster

Tekst aan een bestaand bestand toevoegen

Dat is beter, maar in feite is het niet het hele gedicht. Het laatste vers ontbreekt. Het laatste vers in Jabberwocky is hetzelfde als het eerste vers.

Als we het eerste couplet in een bestand hebben, kunnen we dit onderaan het bestand jabberwocky.txt toevoegen, en dan hebben we het volledige gedicht.

In dit volgende commando moeten we gebruiken >>, niet alleen >. Als we er een gebruiken > goed overschrijven jabberwocky.txt. Dat willen we niet doen. Wij willen toevoegen tekst naar de onderkant ervan.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt in een terminalvenster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Laten we de inhoud van het bestand jabberwocky.txt controleren:</p>
<pre>cat jabberwocky.txt</pre>
<p><img loading=

En tot slot zijn alle delen van het gedicht bij elkaar.

inhoud van jabberwocky.txt in een terminalvenster

Stdin

U kunt invoer van het toetsenbord omleiden naar een bestand met cat. Alles wat u typt, wordt omgeleid naar het bestand totdat u op Ctrl + D drukt. Merk op dat we een enkele gebruiken > omdat we het bestand willen maken (of het willen overschrijven, als het bestaat).

cat > my_poem.txt

cat> my_poem.txt in een terminalvenster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>We kunnen beginnen met typen zodra we de opdracht geven.  We drukken op Ctrl + D als we klaar zijn.  We kunnen dan de inhoud van het nieuwe bestand controleren met:</p>
<pre>cat my-poem.txt</pre>
<p><img loading=

Dat geluid als een verre turbine is waarschijnlijk Lewis Carroll die met hoge snelheid in zijn graf ronddraait.

Het tac-commando

tac is vergelijkbaar met cat, maar het geeft de inhoud van bestanden in omgekeerde volgorde weer.

Laten we eens kijken:

tac my_poem.txt

tac my_poem.txt in een terminalvenster

En het bestand wordt in omgekeerde volgorde in het terminalvenster weergegeven. In dit geval heeft het geen invloed op zijn literaire verdiensten.

my_poem.txt weergegeven in omgekeerde volgorde in een terminalvenster

Tac gebruiken met stdin

Gebruik makend van tac zonder een bestandsnaam zal het werken op de invoer van het toetsenbord. Als u op Ctrl + D drukt, wordt de invoerfase gestopt en tac zal in omgekeerde volgorde weergeven wat u had ingetypt.

tac

tac werken met stdin in een terminalvenster

Wanneer Ctrl + D wordt geraakt, wordt de invoer omgekeerd en weergegeven in het terminalvenster.

uitvoer van tac met behulp van stdin in een terminalvenster

Tac gebruiken met logbestanden

Afgezien van laagwaardige salontrucs, kan tac iets nuttigs doen? Ja het kan. Veel logboekbestanden voegen hun nieuwste vermeldingen toe aan de onderkant van het bestand. Gebruik makend van tac (en, contra-intuïtief, head) kunnen we het laatste item in het terminalvenster laten verschijnen.

We gebruiken tac om het syslog-bestand in omgekeerde volgorde weer te geven en het naar head. Door te vertellen head om alleen de eerste regel af te drukken die het ontvangt (dankzij tac is de laatste regel in het bestand), zien we het laatste item in het syslog-bestand.

tac /var/log/syslog | head -1

tac / var / log / syslog |  head -1 in een terminalvenster

head drukt het laatste item uit het syslog-bestand af en sluit af.

Let daar op head drukt maar één regel af – zoals we hadden gevraagd – maar de regel is zo lang dat hij twee keer rondloopt. Daarom ziet het eruit als drie regels uitvoer in het terminalvenster.

laatste invoer van syslog in een terminalvenster

Tac gebruiken met tekstrecords

De laatste truc tac heeft in petto is een schoonheid.

Meestal tac werkt op tekstbestanden door er regel voor regel doorheen te werken, van onder naar boven. Een regel is een reeks tekens die wordt beëindigd door een teken voor een nieuwe regel. Maar we kunnen het zien tac om met andere scheidingstekens te werken. Dit stelt ons in staat om “brokken” gegevens in het tekstbestand te behandelen als gegevensrecords.

Laten we zeggen dat we een logbestand hebben van een programma dat we moeten herzien of analyseren. Laten we het formaat eens bekijken met less.

less logfile.dat

minder logfile in een terminalvenster

Zoals we kunnen zien, heeft het bestand een herhalend formaat. Er zijn reeksen van drie regels met hexadecimale waarden. Elke set van drie hexadecimale regels heeft een labelregel die begint met “= SEQ”, gevolgd door een reeks cijfers.

bovenaan de logfile in een terminalvenster

Als we naar de onderkant van het bestand scrollen, kunnen we zien dat er veel van deze records zijn. De laatste is genummerd 865.

onderaan de logfile in een terminalvenster

Laten we aannemen dat we om wat voor reden dan ook dit bestand in omgekeerde volgorde moeten doorlopen, data record voor data record. De regelvolgorde van de drie hexadecimale regels in elk gegevensrecord moet behouden blijven.

We zullen opmerken dat de laatste drie regels in het bestand beginnen met hexadecimale waarden 93, E7 en B8, in die volgorde.

Laten we gebruiken tac om het bestand om te draaien. Het is een erg lang bestand, dus we zullen het erin pijpen less.

tac logfile.dat | less

tac logfile.dat |  minder in een terminalvenster

Dat keert het bestand om, maar het is niet het resultaat dat we willen. We willen dat het bestand wordt omgekeerd, maar de regels in elk gegevensrecord moeten in hun oorspronkelijke volgorde staan.

omgekeerd logbestand in minder in een terminalvenster

We hebben eerder vastgesteld dat de laatste drie regels in het bestand beginnen met hexadecimale waarden 93, E7 en B8, in die volgorde. De volgorde van die regels is omgekeerd. Ook zijn de “= SEQ” -regels nu hieronder elke set van drie hexadecimale lijnen.

tac te hulp schieten.

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

tac -b -r -s ^ = SEQ. +[0-9]+ * $ logfile.dat |  minder in een terminalvenster

Laten we dat opsplitsen.

De -s (scheidingsteken) optie informeert tac wat we willen gebruiken als scheidingsteken tussen onze records. Het zegt tac niet om het gebruikelijke teken voor een nieuwe regel te gebruiken, maar om in plaats daarvan ons scheidingsteken te gebruiken.

De -r (regex) optie vertelt tac om de scheidingstekenreeks als een reguliere expressie te behandelen.

De -b (voor) optie oorzaken tac om het scheidingsteken weer te geven voordat elk record in plaats van erna (wat de gebruikelijke positie is van het standaardscheidingsteken, het teken voor een nieuwe regel).

De -s (scheidingsteken) tekenreeks ^=SEQ.+[0-9]+*$ wordt als volgt ontcijferd:

De ^ teken staat voor het begin van de regel. Dit wordt gevolgd door =SEQ.+[0-9]+*$. Dit instrueert tac om te zoeken naar elk exemplaar van ‘= SEQ’. aan het begin van een regel, gevolgd door een willekeurige reeks cijfers (aangegeven door [0-9]), en gevolgd door een andere reeks tekens (aangegeven door *$).

We pompen de hele boel in less, zoals gewoonlijk.

omgekeerd logbestand met correct gevormde gegevensrecords

Ons bestand wordt nu in omgekeerde volgorde gepresenteerd met elke regel “= SEQ” -label vermeld voordat de drie regels hexadecimale gegevens. De drie regels met hexadecimale waarden staan ​​in hun origineel volgorde binnen elk gegevensrecord.

We kunnen dit eenvoudig controleren. De eerste waarde van de eerste drie hexadecimale regels (die de laatste drie regels waren voordat het bestand werd omgekeerd) komen overeen met de waarden die we eerder hebben vastgelegd: 93, E7 en B8, in die volgorde.

Dat is nogal een truc voor een one-liner voor een terminalvenster.

Alles heeft een doel

In de Linux-wereld kunnen zelfs de ogenschijnlijk eenvoudigste commando’s en hulpprogramma’s verrassende en krachtige eigenschappen hebben.

De ontwerpfilosofie van eenvoudige hulpprogramma’s die één ding goed doen en die gemakkelijk samenwerken met andere hulpprogramma’s, heeft geleid tot enkele vreemde kleine commando’s, zoals tac. Op het eerste gezicht lijkt het een beetje vreemd. Maar als je onder de oppervlakte tuurt, is er een onverwachte kracht die je in je voordeel kunt gebruiken.

Of, zoals een andere filosofie zegt: “Veracht de slang niet omdat hij geen horens heeft, want wie zal zeggen dat hij geen draak zal worden?”

Nieuwste artikelen

Gerelateerde artikelen