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.
Indholdsfortegnelse
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.
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
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
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
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?"