Sådan bruger du Linux kat og tac-kommandoer

Cat og tac-kommandoerne viser indholdet af tekstfiler, men der er mere i dem, end man kan se. Dyk lidt dybere og lær nogle produktive Linux-kommandolinjetricks.

Dette er to enkle små kommandoer, der ofte afvises som værende netop det – for enkle til at være til nogen reel nytte. Men når du kender de forskellige måder, du kan bruge dem på, vil du se, at de er perfekt i stand til at gøre deres rimelige andel af de tunge løft, når det kommer til at arbejde med filer.

Kattekommandoen

kat er vant til undersøge indholdet af tekstfiler, og for at sammenføje dele af filer for at danne en større fil.

På én gang – tilbage i opkaldets æra modem— Binære filer blev ofte opdelt i flere mindre filer for at gøre download lettere. I stedet for at downloade en stor fil trak du hver mindre fil tilbage. Hvis en enkelt fil ikke kunne downloades korrekt, ville du bare hente den ene fil igen.

Selvfølgelig havde du så brug for en måde at rekonstruere samlingen af ​​mindre filer tilbage til den enkelte fungerende binære fil. Den proces blev kaldt sammenkædning. Og det er der, katten kom ind, og hvor den har sit navn fra.

Bredbånds- og fiberforbindelser har fået det særlige behov til at falme – ligesom skrigende opkaldslyde – så hvad er der tilbage for katten at gøre i dag? Rigtig meget faktisk.

Visning af en tekstfil

For at få cat til at liste indholdet af en tekstfil til et terminalvindue, skal du bruge følgende kommando.

Sørg for, at filen er en tekstfil. Hvis du forsøger at liste indholdet af en binær fil til terminalvinduet, vil resultaterne være uforudsigelige. Du kan ende med en låst terminalsession eller værre.

cat poem1.txt

Indholdet af filen poem1.txt vises i terminalvinduet.

Det er kun halvdelen af ​​det berømte digt. Hvor er resten af ​​det? Der er en anden fil her kaldet poem2.txt. Vi kan få kat til at liste indholdet af flere filer med én kommando. Alt, hvad vi skal gøre, er at liste filerne i rækkefølge på kommandolinjen.

cat poem1.txt poem2.txt

Det ser bedre ud; vi har hele digtet nu.

Bruger kat med mindre

Digtet er der alt sammen, men det skød forbi vinduet for hurtigt til at kunne læse de første par vers. Vi kan overføre output fra kat til mindre og scrolle ned gennem teksten i vores eget tempo.

cat poem1.txt poem2.txt | less

Vi kan nu bevæge os frem og tilbage gennem teksten i én strøm, selvom den holdes i to separate tekstfiler.

  Sådan installeres Linux på en Mac

Nummerering af linjerne i en fil

Vi kan få kat nummereret linjerne i filen, som den vises. For at gøre dette bruger vi muligheden -n (tal).

cat -n poem1.txt

Linjerne er nummereret, som de vises i terminalvinduet.

Nummerer ikke tomme linjer

Det lykkedes at få linjerne nummereret efter kat, men de tomme linjer mellem versene bliver også talt. For at få tekstlinjerne nummereret, men for at ignorere de tomme linjer, skal du bruge indstillingen -b (nummer-ikke-blank).

cat -b poem1.txt

Nu er tekstlinjerne nummereret, og de tomme linjer springes over.

Vis ikke flere tomme linjer

Hvis der er sektioner af på hinanden følgende tomme linjer i en fil, kan vi bede cat om at ignorere alle på nær én tomme linjer. Se på denne fil.

Den næste kommando vil få cat til kun at vise én tom linje fra hver bundt tomme linier. Den mulighed, vi skal bruge for at opnå dette, er -s (squeeze-blank).

cat -s poem1.txt

Dette påvirker ikke indholdet af filen på nogen måde; det ændrer bare måden, cat viser filen på.

Vis faner

Hvis du vil vide, om mellemrum er forårsaget af mellemrum eller tabulatorer, kan du finde ud af det ved at bruge -T (vis-faneblade).

cat -T poem1.txt

Fanerne er repræsenteret af tegnene “^I”.

Visning af enderne af linjer

Du kan tjekke efter mellemrum ved at bruge indstillingen -E (vis-ender).

cat -E poem1.txt

Enderne af linjer er repræsenteret af tegnet “$”.

Sammenkædning af filer

Det giver ikke mening at have et digt gemt i to filer, med en halvdel i hver. Lad os slå dem sammen og lave en ny fil med hele digtet i.

cat poem1.txt poem2.txt > jabberwocky.txt

cat poem1.txt poem2.txt > jabberwocky.txt i et terminalvindue” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>lad os bruge cat til at tjekke vores nye fil:</p>
<pre>cat jabberwocky.txt</pre > <p><img loading=

Vores nye fil indeholder indholdet af de to andre filer.

Tilføjelse af tekst til en eksisterende fil

Det er bedre, men i virkeligheden er det ikke hele digtet. Det sidste vers mangler. Det sidste vers i Jabberwocky er det samme som det første vers.

Hvis vi har det første vers i en fil, kan vi tilføje dette til bunden af ​​jabberwocky.txt-filen, så har vi hele digtet.

I denne næste kommando skal vi bruge >>, ikke kun >. Hvis vi bruger en enkelt > overskriver vi jabberwocky.txt. Det ønsker vi ikke at gøre. Vi ønsker at tilføje tekst til bunden af ​​den.

cat first_verse.txt >> jabberwocky.txt

cat first_verse.txt >> jabberwocky.txt i et terminalvindue” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Lad os tjekke indholdet af jabberwocky.txt-filen:</p>
<pre>cat jabberwocky.txt< /pre> <p><img loading=

Og endelig er alle dele af digtet samlet.

Omdirigerer stdin

Du kan omdirigere input fra tastaturet til en fil ved hjælp af cat. Alt, hvad du skriver, omdirigeres til filen, indtil du trykker på Ctrl+D. Bemærk, at vi bruger en enkelt > fordi vi vil oprette filen (eller overskrive den, hvis den findes).

cat > my_poem.txt

kat > mit_digt.txt i et terminalvindue” width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”  onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”></p>
<p>Vi kan begynde at skrive, så snart vi udsteder kommandoen.  Vi trykker på Ctrl+D, når vi er færdige.  Vi kan derefter kontrollere indholdet af den nye fil med:</p>
<pre>cat my-poem.txt</pre>
<p><img loading=

Det, der lyder som en fjern turbine, er sandsynligvis Lewis Carroll, der snurrer i sin grav i høj hastighed.

Tac-kommandoen

tac ligner cat, men den viser indholdet af filer i omvendt rækkefølge.

Lad os se det:

tac my_poem.txt

Og filen vises i terminalvinduet i omvendt rækkefølge. I dette tilfælde har det ingen indflydelse på dets litterære fordele.

Brug af tac med stdin

Brug af tac uden et filnavn vil få det til at fungere på input fra tastaturet. Hvis du trykker på Ctrl+D, stoppes inputfasen, og tac vil liste i omvendt rækkefølge, hvad end du har indtastet.

tac

Når Ctrl+D trykkes, vendes inputtet og vises til terminalvinduet.

Brug af tac med logfiler

Kan tac gøre noget nyttigt bortset fra salontricks af lav kvalitet? Ja den kan. Mange logfiler tilføjer deres nyeste poster i bunden af ​​filen. Ved at bruge tac (og modintuitivt head) kan vi poppe den sidste indtastning ind i terminalvinduet.

Vi bruger tac til at liste syslog-filen i omvendt rækkefølge og røre den ind i hovedet. Ved at fortælle hovedet kun at udskrive den første linje, det modtager (som takket være tac er den sidste linje i filen), ser vi den seneste post i syslog-filen.

tac /var/log/syslog | head -1

head udskriver den seneste post fra syslog-filen og afslutter derefter.

Bemærk, at hovedet kun udskriver én linje - som vi bad om - men linjen er så lang, at den vikles rundt to gange. Det er derfor, det ligner tre outputlinjer i terminalvinduet.

Brug af tac med Text Records

Den sidste trick tac har i ærmet er en skønhed.

Normalt opererer tac på tekstfiler ved at arbejde sig gennem dem linje for linje, fra bunden og op. En linje er en sekvens af tegn, der afsluttes af et nylinjetegn. Men vi kan fortælle tac at arbejde med andre afgrænsere. Dette giver os mulighed for at behandle "bidder" af data i tekstfilen som dataposter.

Lad os sige, at vi har en logfil fra et eller andet program, som vi skal gennemgå eller analysere. Lad os se på dets format med mindre.

less logfile.dat

Som vi kan se, er der et gentaget format til filen. Der er sekvenser af tre linjer af hexadecimal værdier. Hvert sæt af tre linjer med hexadecimal har en etiketlinje, der starter "=SEQ", efterfulgt af en sekvens af cifre.

Hvis vi scroller til bunden af ​​filen, kan vi se, at der er mange af disse poster. Den sidste er nummereret 865.

Lad os antage, at vi uanset årsagen skal arbejde gennem denne fil i omvendt rækkefølge, datapost for datapost. Linjerækkefølgen af ​​de tre hexadecimale linjer i hver datapost skal bevares.

Vi noterer os, at de sidste tre linjer i filen starter med hexadecimale værdier 93, E7 og B8, i nævnte rækkefølge.

Lad os bruge tac til at vende filen. Det er en meget lang fil, så vi rører den ind i mindre.

tac logfile.dat | less

Det vender filen om, men det er ikke det resultat, vi ønsker. Vi ønsker, at filen skal vendes, men linjerne i hver datapost skal være i deres oprindelige rækkefølge.

Vi registrerede tidligere, at de sidste tre linjer i filen starter med hexadecimale værdier 93, E7 og B8, i nævnte rækkefølge. Rækkefølgen af ​​disse linjer er blevet omvendt. Også "=SEQ"-linjerne er nu under hvert sæt af tre hexadecimale linjer.

tac til undsætning.

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

Lad os bryde det ned.

Indstillingen -s (separator) informerer tac om, hvad vi vil bruge som afgrænsning mellem vores poster. Det fortæller tac ikke at bruge sin sædvanlige newline-karakter, men at bruge vores separator i stedet.

Indstillingen -r (regex) fortæller tac at behandle separatorstrengen som en almindelig udtryk.

Indstillingen -b (before) får tac til at vise separatoren før hver post i stedet for efter den (hvilket er den sædvanlige position for dens standardseparator, newline-tegnet).

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

Tegnet ^ repræsenterer starten af ​​linjen. Dette efterfølges af =SEQ.+[0-9]+*$. Dette instruerer tac om at lede efter hver forekomst af "=SEQ." i starten af ​​en linje, efterfulgt af en vilkårlig sekvens af cifre (angivet med [0-9]), og efterfulgt af ethvert andet sæt tegn (angivet med *$).

Vi rører det hele ud i mindre, som sædvanligt.

Vores fil er nu præsenteret i omvendt rækkefølge med hver "=SEQ" etiketlinje anført før dens tre linjer med hexadecimale data. De tre linjer med hexadecimale værdier er i deres oprindelige rækkefølge inden for hver datapost.

Det kan vi nemt tjekke. Den første værdi af de første tre linjer med hexadecimal (som var de sidste tre linjer, før filen blev vendt) matcher de værdier, som vi optog tidligere: 93, E7 og B8, i den rækkefølge.

Det er noget af et trick for en terminalvindue one-liner.

Alt har et formål

I Linux-verdenen kan selv de tilsyneladende simpleste kommandoer og hjælpeprogrammer have overraskende og kraftfulde egenskaber.

Designfilosofien bag simple hjælpeprogrammer der gør én ting godt, og som nemt fungerer sammen med andre hjælpeprogrammer, har givet anledning til nogle mærkelige små kommandoer, såsom tac. Umiddelbart ser det ud til at være lidt af en særhed. Men når du kigger under overfladen, er der en uventet kraft, som du kan udnytte til din fordel.

Eller, som en anden filosofi siger: "Foragt ikke slangen for ikke at have horn, for hvem vil sige, at den ikke skal blive en drage?"