Slik bruker du Linux cat and tac-kommandoene

Katten og tac-kommandoene viser innholdet i tekstfiler, men det er mer i dem enn man kan se. Dykk litt dypere og lær deg noen produktive Linux-kommandolinjetriks.

Dette er to enkle små kommandoer, ofte avvist som å være nettopp det – for enkle til å være til noen reell nytte. Men når du først kjenner de forskjellige måtene du kan bruke dem på, vil du se at de er perfekt i stand til å gjøre sin rettferdige del av de tunge løftene når det kommer til arbeid med filer.

Katten Kommando

katten er vant til undersøke innholdet i tekstfilerog for å slå sammen deler av filer for å danne en større fil.

På en gang – tilbake i oppringingstiden modem— Binære filer ble ofte delt opp i flere mindre filer for å gjøre nedlastingen enklere. I stedet for å laste ned én stor fil, trakk du tilbake hver mindre fil. Hvis en enkelt fil ikke ble lastet ned riktig, ville du bare hente den ene filen igjen.

Selvfølgelig trengte du da en måte å rekonstruere samlingen av mindre filer tilbake til den eneste fungerende binære filen. Den prosessen ble kalt sammenkobling. Og det var der katten kom inn og der den har fått navnet sitt fra.

Bredbånd og fiberforbindelser har fått det spesielle behovet til å blekne – omtrent som skrikende oppringningslyder – så hva gjenstår for katten å gjøre i dag? Ganske mye faktisk.

Vise en tekstfil

For å få cat til å liste innholdet i en tekstfil til et terminalvindu, bruk følgende kommando.

Sørg for at filen er en tekstfil. Hvis du prøver å liste innholdet i en binær fil til terminalvinduet, vil resultatene være uforutsigbare. Du kan ende opp med en låst terminaløkt eller verre.

cat poem1.txt

Innholdet i filen poem1.txt vises i terminalvinduet.

Det er bare halvparten av det berømte diktet. Hvor er resten? Det er en annen fil her kalt poem2.txt. Vi kan få katt til å liste innholdet i flere filer med én kommando. Alt vi trenger å gjøre er å liste filene i rekkefølge på kommandolinjen.

cat poem1.txt poem2.txt

Det ser bedre ut; vi har hele diktet nå.

Bruker katt med mindre

Diktet er der, men det skjøt forbi vinduet for fort til å lese de første par versene. Vi kan overføre utdata fra katt til mindre og bla ned gjennom teksten i vårt eget tempo.

cat poem1.txt poem2.txt | less

Vi kan nå gå bakover og fremover gjennom teksten i én strøm, selv om den holdes i to separate tekstfiler.

  Hvordan bruke rev Command på Linux

Nummerering av linjene i en fil

Vi kan la kattnummerere linjene i filen slik den vises. For å gjøre dette bruker vi alternativet -n (tall).

cat -n poem1.txt

Linjene er nummerert slik de vises i terminalvinduet.

Ikke nummer tomme linjer

Vi klarte å få linjene nummerert etter katt, men de tomme linjene mellom versene telles også. For å få tekstlinjene nummerert, men for å ignorere de tomme linjene, bruk alternativet -b (nummer-ikke-blank).

cat -b poem1.txt

Nå er tekstlinjene nummerert, og de tomme linjene hoppes over.

Ikke vis flere tomme linjer

Hvis det er deler av påfølgende tomme linjer i en fil, kan vi be cat ignorere alle unntatt én blank linje. Se på denne filen.

Den neste kommandoen vil få cat til å vise bare én blank linje fra hver haug med tomme linjer. Alternativet vi trenger for å oppnå dette er alternativet -s (klem-blank).

cat -s poem1.txt

Dette påvirker ikke innholdet i filen på noen måte; det endrer bare måten cat viser filen på.

Vis faner

Hvis du vil vite om mellomrom er forårsaket av mellomrom eller tabulatorer, kan du finne det ut ved å bruke alternativet -T (vis-faner).

cat -T poem1.txt

Fanene er representert med tegnene «^I».

Viser slutten av linjer

Du kan sjekke for etterfølgende mellomrom ved å bruke alternativet -E (vis-ender).

cat -E poem1.txt

Endene av linjene er representert med tegnet «$».

Sammenknytte filer

Det gir ikke mening å ha et dikt lagret i to filer, med en halvdel i hver. La oss slå dem sammen og lage en ny fil med hele diktet i.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt > jabberwocky.txt i et terminalvindu” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>la oss bruke cat til å sjekke vår nye fil:</p>
<pre>cat jabberwocky.txt</pre > <p><img loading=

Vår nye fil inneholder innholdet i de to andre filene.

Legge til tekst til en eksisterende fil

Det er bedre, men faktisk er det ikke hele diktet. Det siste verset mangler. Det siste verset i Jabberwocky er det samme som det første verset.

Hvis vi har det første verset i en fil, kan vi legge dette til nederst i filen jabberwocky.txt, så har vi hele diktet.

I denne neste kommandoen må vi bruke >>, ikke bare >. Hvis vi bruker en enkelt > vil vi overskrive jabberwocky.txt. Det ønsker vi ikke å gjøre. Vi ønsker å legge til tekst nederst i den.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt i et terminalvindu” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>La oss sjekke innholdet i jabberwocky.txt-filen:</p>
<pre>cat jabberwocky.txt< /pre> <p><img loading=

Og til slutt er alle delene av diktet samlet.

Omdirigerer stdin

Du kan omdirigere input fra tastaturet til en fil ved hjelp av cat. Alt du skriver blir omdirigert til filen til du trykker Ctrl+D. Merk at vi bruker en enkelt > fordi vi ønsker å lage filen (eller overskrive den, hvis den finnes).

cat > my_poem.txt

cat > my_poem.txt i et terminalvindu” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Vi kan begynne å skrive så snart vi gir kommandoen.  Vi trykker Ctrl+D når vi er ferdige.  Vi kan deretter sjekke innholdet i den nye filen med:</p>
<pre>cat my-poem.txt</pre>
<p><img loading=

Det høres ut som en fjern turbin, det er sannsynligvis Lewis Carroll som snurrer i graven sin i høy hastighet.

Tac-kommandoen

tac ligner på cat, men den viser innholdet i filene i omvendt rekkefølge.

La oss se at:

tac my_poem.txt

Og filen er oppført til terminalvinduet i omvendt rekkefølge. I dette tilfellet har det ingen innvirkning på dens litterære fordeler.

Bruke tac Med stdin

Bruk av tac uten filnavn vil føre til at den opererer på inndata fra tastaturet. Å trykke Ctrl+D vil stoppe inndatafasen, og tac vil vise i omvendt rekkefølge det du har skrevet inn.

tac

Når Ctrl+D trykkes, reverseres inngangen og vises til terminalvinduet.

Bruke tac med loggfiler

Kan tac gjøre noe nyttig bortsett fra triks i salonger med lav kvalitet? Ja det kan det. Mange loggfiler legger til sine nyeste oppføringer nederst i filen. Ved å bruke tac (og, kontraintuitivt, head) kan vi åpne den siste oppføringen i terminalvinduet.

Vi bruker tac for å liste syslog-filen i revers, og røre den inn i hodet. Ved å be headet bare skrive ut den første linjen den mottar (som takket være tac er den siste linjen i filen), ser vi den siste oppføringen i syslog-filen.

tac /var/log/syslog | head -1

head skriver ut den siste oppføringen fra syslog-filen og avslutter deretter.

Legg merke til at hodet bare skriver ut én linje – som vi ba om – men linjen er så lang at den går rundt to ganger. Det er derfor det ser ut som tre utdatalinjer i terminalvinduet.

Bruke tac med tekstposter

Det siste trikset har i ermet er en skjønnhet.

Vanligvis opererer tac på tekstfiler ved å jobbe seg gjennom dem linje for linje, fra bunnen og opp. En linje er en sekvens av tegn som avsluttes med et nylinjetegn. Men vi kan fortelle tac å jobbe med andre skilletegn. Dette lar oss behandle "biter" av data i tekstfilen som dataposter.

La oss si at vi har en loggfil fra et program som vi må gjennomgå eller analysere. La oss ta en titt på formatet med mindre.

less logfile.dat

Som vi kan se, er det et repeterende format til filen. Det er sekvenser på tre linjer med heksadesimal verdier. Hvert sett med tre linjer med heksadesimal har en etikettlinje som starter "=SEQ", etterfulgt av en sekvens med sifre.

Hvis vi blar til bunnen av filen, kan vi se at det er mange av disse postene. Den siste er nummerert 865.

La oss anta at vi uansett grunn trenger å jobbe gjennom denne filen i omvendt rekkefølge, datapost for datapost. Linjerekkefølgen til de tre heksadesimale linjene i hver datapost må bevares.

Vi noterer oss at de tre siste linjene i filen starter med heksadesimale verdier 93, E7 og B8, i den rekkefølgen.

La oss bruke tac for å reversere filen. Det er en veldig lang fil, så vi vil røre den inn i mindre.

tac logfile.dat | less

Det reverserer filen, men det er ikke resultatet vi ønsker. Vi ønsker at filen skal reverseres, men linjene i hver datapost må være i sin opprinnelige rekkefølge.

Vi registrerte tidligere at de tre siste linjene i filen starter med heksadesimale verdier 93, E7 og B8, i den rekkefølgen. Rekkefølgen på disse linjene er snudd. Dessuten er "=SEQ"-linjene nå under hvert sett med tre heksadesimale linjer.

tac til unnsetning.

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

La oss bryte det ned.

Alternativet -s (separator) informerer tac om hva vi ønsker å bruke som skilletegn mellom postene våre. Den forteller tac å ikke bruke den vanlige nylinjekarakteren, men å bruke skilletegn i stedet.

Alternativet -r (regex) forteller tac å behandle separatorstrengen som en vanlig uttrykk.

Alternativet -b (før) får tac til å liste skilletegn før hver post i stedet for etter den (som er den vanlige posisjonen til standardskilletegn, nylinjetegnet).

-s (separator)-strengen ^=SEQ.+[0-9]+*$ er dechiffrert som følger:

Tegnet ^ representerer starten på linjen. Dette etterfølges av =SEQ.+[0-9]+*$. Dette instruerer tac å se etter hver forekomst av "=SEQ." på begynnelsen av en linje, etterfulgt av en hvilken som helst sekvens av sifre (angitt med [0-9]), og etterfulgt av et hvilket som helst annet sett med tegn (indikert med *$).

Vi legger hele partiet til mindre, som vanlig.

Filen vår presenteres nå i omvendt rekkefølge med hver "=SEQ"-etikettlinje oppført før de tre linjene med heksadesimale data. De tre linjene med heksadesimale verdier er i sin opprinnelige rekkefølge innenfor hver datapost.

Vi kan enkelt sjekke dette. Den første verdien av de tre første linjene med heksadesimal (som var de tre siste linjene før filen ble reversert) samsvarer med verdiene som vi registrerte tidligere: 93, E7 og B8, i den rekkefølgen.

Det er litt av et triks for en one-liner med terminalvindu.

Alt har en hensikt

I Linux-verdenen kan selv de tilsynelatende enkleste kommandoene og verktøyene ha overraskende og kraftige egenskaper.

Designfilosofien til enkle verktøy som gjør én ting bra, og som lett samvirker med andre verktøy, har gitt opphav til noen merkelige små kommandoer, for eksempel tac. Ved første øyekast ser det ut til å være litt rart. Men når du kikker under overflaten, er det en uventet kraft som du kan utnytte til din fordel.

Eller, som en annen filosofi sier: "Ikke forakt slangen fordi den ikke har horn, for hvem vil si at den ikke skal bli en drage?"