Hur man använder Linux cat and tac-kommandon

Katten och tac-kommandona visar innehållet i textfiler, men det finns mer i dem än vad man kan se. Dyk lite djupare och lär dig några produktiva Linux kommandoradstrick.

Det här är två enkla små kommandon som ofta avfärdas som just det – för enkla för att vara till någon verklig användning. Men när du väl känner till de olika sätten du kan använda dem på, kommer du att se att de är perfekt kapabla att göra sin beskärda del av det tunga arbetet när det kommer till att arbeta med filer.

Katten Kommando

katt är van vid granska innehållet i textfileroch för att sammanfoga delar av filer för att bilda en större fil.

En gång – tillbaka i uppringningstiden modem— Binära filer bröts ofta upp i flera mindre filer för att göra nedladdningen enklare. Istället för att ladda ner en stor fil drog du tillbaka varje mindre fil. Om en enskild fil inte kunde laddas ner korrekt, skulle du bara hämta den filen igen.

Naturligtvis behövde du sedan ett sätt att rekonstruera samlingen av mindre filer tillbaka till den enda fungerande binära filen. Den processen kallades sammanlänkning. Och det var där katten kom in och där den har fått sitt namn ifrån.

Bredbands- och fiberanslutningar har fått just det behovet att blekna – ungefär som skriande uppringningsljud – så vad återstår för katten att göra idag? Ganska mycket faktiskt.

Visar en textfil

För att låta cat lista innehållet i en textfil till ett terminalfönster, använd följande kommando.

Se till att filen är en textfil. Om du försöker lista innehållet i en binär fil till terminalfönstret kommer resultaten att bli oförutsägbara. Du kan sluta med en låst terminalsession eller ännu värre.

cat poem1.txt

Innehållet i filen poem1.txt visas i terminalfönstret.

Det är bara hälften av den berömda dikten. Var är resten? Det finns en annan fil här som heter poem2.txt. Vi kan få katt att lista innehållet i flera filer med ett kommando. Allt vi behöver göra är att lista filerna i ordning på kommandoraden.

cat poem1.txt poem2.txt

Det ser bättre ut; vi har hela dikten nu.

Använder katt med mindre

Dikten finns där, men den sköt förbi fönstret för snabbt för att kunna läsa de första verserna. Vi kan flytta utdata från katt till mindre och scrolla ner genom texten i vår egen takt.

cat poem1.txt poem2.txt | less

Vi kan nu gå bakåt och framåt genom texten i en ström, även om den hålls i två separata textfiler.

Numrering av raderna i en fil

Vi kan ha kattnummer raderna i filen när den visas. För att göra detta använder vi alternativet -n (nummer).

cat -n poem1.txt

Raderna är numrerade så som de visas i terminalfönstret.

Numrera inte tomma rader

Vi lyckades få raderna numrerade efter katt, men de tomma raderna mellan verserna räknas också. För att få textraderna numrerade men för att ignorera de tomma raderna, använd alternativet -b (nummer-icke-tomt).

cat -b poem1.txt

Nu är textraderna numrerade och de tomma raderna hoppas över.

Visa inte flera tomma rader

Om det finns delar av på varandra följande tomma rader i en fil, kan vi be cat att ignorera alla utom en tom rad. Titta på den här filen.

Nästa kommando gör att cat endast visar en tom rad från varje gäng tomma rader. Alternativet vi behöver för att uppnå detta är alternativet -s (squeeze-blank).

cat -s poem1.txt

Detta påverkar inte innehållet i filen på något sätt; det ändrar bara hur cat visar filen.

Visa flikar

Om du vill veta om blanksteg orsakas av mellanslag eller tabbar, kan du ta reda på det med alternativet -T (visa-flikar).

cat -T poem1.txt

Flikarna representeras av tecknen ”^I”.

Visar ändarna på raderna

Du kan kontrollera efter blanksteg genom att använda alternativet -E (visa slutar).

cat -E poem1.txt

Sluten på raderna representeras av tecknet ”$”.

Sammanfoga filer

Det är inte meningsfullt att ha en dikt sparad i två filer, med en halva i varje. Låt oss slå ihop dem och skapa en ny fil med hela dikten i.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt > jabberwocky.txt i ett terminalfönster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>låt oss använda cat för att kontrollera vår nya fil:</p>
<pre>cat jabberwocky.txt</pre > <p><img loading=

Vår nya fil innehåller innehållet i de andra två filerna.

Lägga till text till en befintlig fil

Det är bättre, men i själva verket är det inte hela dikten. Sista versen saknas. Den sista versen i Jabberwocky är densamma som den första.

Om vi ​​har den första versen i en fil kan vi lägga till den längst ner i filen jabberwocky.txt, så får vi hela dikten.

I nästa kommando måste vi använda >>, inte bara >. Om vi ​​använder en singel > kommer vi att skriva över jabberwocky.txt. Det vill vi inte göra. Vi vill lägga till text längst ner i den.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt i ett terminalfönster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Låt oss kontrollera innehållet i filen jabberwocky.txt:</p>
<pre>cat jabberwocky.txt< /pre> <p><img loading=

Och slutligen, alla delar av dikten är tillsammans.

Omdirigerar stdin

Du kan omdirigera indata från tangentbordet till en fil med hjälp av cat. Allt du skriver omdirigeras till filen tills du trycker på Ctrl+D. Observera att vi använder en singel > eftersom vi vill skapa filen (eller skriva över den, om den finns).

cat > my_poem.txt

cat > my_poem.txt i ett terminalfönster” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Vi kan börja skriva så snart vi utfärdar kommandot.  Vi trycker på Ctrl+D när vi är klara.  Vi kan sedan kontrollera innehållet i den nya filen med:</p>
<pre>cat my-poem.txt</pre>
<p><img loading=

Det där låter som en avlägsen turbin är förmodligen Lewis Carroll som snurrar i sin grav i hög hastighet.

Tac-kommandot

tac liknar cat, men den listar innehållet i filer i omvänd ordning.

Låt oss se att:

tac my_poem.txt

Och filen listas i terminalfönstret i omvänd ordning. I det här fallet har det ingen effekt på dess litterära meriter.

Använder tac med stdin

Om du använder tac utan ett filnamn kommer den att fungera på inmatningen från tangentbordet. Om du trycker på Ctrl+D stoppas inmatningsfasen, och tac kommer att lista i omvänd ordning vad du än har skrivit in.

tac

När Ctrl+D trycks, vänds inmatningen och visas i terminalfönstret.

Använda tac med loggfiler

Kan tac göra något användbart förutom lågvärdiga salongstricks? Ja, det kan det. Många loggfiler lägger till sina senaste poster längst ner i filen. Med hjälp av tac (och, kontraintuitivt, head) kan vi öppna den sista posten i terminalfönstret.

Vi använder tac för att lista syslog-filen i omvänd ordning, och skicka in den i head. Genom att säga till head att bara skriva ut den första raden den tar emot (som tack vare tac är den sista raden i filen), ser vi den senaste posten i syslog-filen.

tac /var/log/syslog | head -1

head skriver ut den senaste posten från syslog-filen och avslutas sedan.

Observera att huvudet bara skriver ut en rad – som vi begärde – men raden är så lång att den slingrar sig runt två gånger. Det är därför det ser ut som tre utdatarader i terminalfönstret.

Använda tac med Text Records

Den sista trick tac har i ärmen är en skönhet.

Vanligtvis arbetar tac med textfiler genom att arbeta sig igenom dem rad för rad, nerifrån och upp. En rad är en sekvens av tecken som avslutas med ett nyradstecken. Men vi kan säga åt tac att arbeta med andra avgränsare. Detta gör att vi kan behandla "bitar" av data i textfilen som dataposter.

Låt oss säga att vi har en loggfil från något program som vi behöver granska eller analysera. Låt oss ta en titt på dess format med mindre.

less logfile.dat

Som vi kan se finns det ett repeterande format till filen. Det finns sekvenser av tre rader av hexadecimal värden. Varje uppsättning av tre rader med hexadecimal har en etikettrad som börjar "=SEQ", följt av en sekvens av siffror.

Om vi ​​scrollar till botten av filen kan vi se att det finns många av dessa poster. Den sista är numrerad 865.

Låt oss anta att vi av någon anledning behöver arbeta igenom den här filen i omvänd ordning, datapost för datapost. Radordningen för de tre hexadecimala raderna i varje datapost måste bevaras.

Vi kommer att notera att de tre sista raderna i filen börjar med hexadecimala värden 93, E7 och B8, i den ordningen.

Låt oss använda tac för att vända filen. Det är en väldigt lång fil så vi ska lägga in den i mindre.

tac logfile.dat | less

Det vänder filen, men det är inte resultatet vi vill ha. Vi vill att filen ska vändas, men raderna i varje datapost måste vara i sin ursprungliga ordning.

Vi spelade in tidigare att de tre sista raderna i filen börjar med hexadecimala värden 93, E7 och B8, i den ordningen. Ordningen på dessa rader har ändrats. Dessutom är "=SEQ"-linjerna nu under varje uppsättning av tre hexadecimala linjer.

tac till undsättning.

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

Låt oss bryta ner det.

Alternativet -s (separator) informerar tac vad vi vill använda som avgränsare mellan våra poster. Den säger åt tac att inte använda sin vanliga nyradstecken, utan att använda vår separator istället.

Alternativet -r (regex) säger åt tac att behandla separatorsträngen som en vanligt uttryck.

Alternativet -b (före) gör att tac listar avgränsaren före varje post istället för efter den (vilket är den vanliga positionen för dess standardavgränsare, nyradstecknet).

Strängen -s (separator) ^=SEQ.+[0-9]+*$ dechiffreras enligt följande:

Tecknet ^ representerar början på raden. Detta följs av =SEQ.+[0-9]+*$. Detta instruerar tac att leta efter varje förekomst av "=SEQ." i början av en rad, följt av valfri sekvens av siffror (anges med [0-9]), och följt av någon annan uppsättning tecken (anges med *$).

Vi sprider allt i mindre, som vanligt.

Vår fil presenteras nu i omvänd ordning med varje "=SEQ"-etikettrad listad före dess tre rader med hexadecimala data. De tre raderna med hexadecimala värden är i sin ursprungliga ordning inom varje datapost.

Vi kan kontrollera detta helt enkelt. Det första värdet på de första tre raderna av hexadecimal (som var de tre sista raderna innan filen vändes) matchar värdena som vi tog ett rekord av tidigare: 93, E7 och B8, i den ordningen.

Det är ett riktigt trick för en terminalfönster-one-liner.

Allt har ett syfte

I Linux-världen kan även de till synes enklaste kommandon och verktyg ha överraskande och kraftfulla egenskaper.

Designfilosofin för enkla verktyg som gör en sak bra, och som lätt samverkar med andra verktyg, har gett upphov till några konstiga små kommandon, som tac. Vid första anblicken verkar det vara lite konstigt. Men när du kikar under ytan finns det en oväntad kraft som du kan utnyttja till din fördel.

Eller, som en annan filosofi säger, "Förakta inte ormen för att den inte har några horn, för vem kan säga att den inte ska bli en drake?"