De to kommandoene «cat» og «tac» brukes ofte til å vise innholdet i tekstfiler. Men de har flere funksjoner enn som så. La oss se nærmere på noen nyttige triks du kan bruke i Linux-kommandolinjen.
Disse kommandoene kan virke enkle, og kanskje ikke så nyttige ved første øyekast. Men når du lærer de forskjellige måtene de kan brukes på, vil du se at de er kraftige verktøy for filhåndtering.
«cat»-kommandoen
«cat»-kommandoen brukes vanligvis for å vise innholdet i tekstfiler og for å kombinere flere filer til en enkelt fil.
I gamle dager, da oppkoblingshastigheter var langsomme, ble binære filer ofte delt opp i mindre deler for enklere nedlasting. I stedet for å laste ned en stor fil, lastet man ned flere mindre filer. Hvis en fil ble ødelagt under nedlasting, lastet man den enkelt ned på nytt.
Etter nedlasting trengte man en måte å sette sammen de mindre filene til den opprinnelige binære filen. Denne prosessen ble kalt «sammenkobling». Og det var her «cat»-kommandoen kom inn i bildet, og det er der den har fått navnet sitt fra.
Med dagens raske bredbånds- og fiberforbindelser er dette behovet mindre aktuelt, men «cat» er fortsatt et nyttig verktøy. Hva kan den gjøre i dag? Overraskende mye.
Visning av tekstfiler
For å vise innholdet i en tekstfil i terminalvinduet, bruk følgende kommando:
Pass på at filen er en tekstfil. Hvis du prøver å vise innholdet i en binær fil, kan resultatet bli uforutsigbart, og du kan ende opp med en låst terminaløkt eller verre.
cat poem1.txt
Innholdet i filen «poem1.txt» vises i terminalvinduet.
Dette er bare halve diktet. Hvor er resten? Det ligger i en annen fil, «poem2.txt». Vi kan bruke «cat» til å vise innholdet i flere filer med en enkelt kommando. Alt vi trenger å gjøre er å liste opp filene i rekkefølge i kommandolinjen.
cat poem1.txt poem2.txt
Det ser bedre ut. Nå har vi hele diktet.
«cat» med «less»
Diktet vises i terminalvinduet, men det forsvant fort oppover skjermen. Vi kan sende utdataene fra «cat» til «less» for å bla gjennom teksten i et mer passende tempo.
cat poem1.txt poem2.txt | less
Nå kan vi bla frem og tilbake gjennom teksten, selv om den er fordelt på to separate tekstfiler.
Nummerering av linjer
Vi kan få «cat» til å nummerere linjene i filen. For å gjøre dette, bruker vi alternativet «-n» (nummer).
cat -n poem1.txt
Linjene er nå nummerert i terminalvinduet.
Ikke nummerer tomme linjer
Vi har nummerert linjene, men tomme linjer telles også. For å nummerere kun tekstlinjer, bruk alternativet «-b» (nummer-ikke-blank).
cat -b poem1.txt
Nå er bare tekstlinjene nummerert, og tomme linjer hoppes over.
Ikke vis flere tomme linjer
Hvis det er flere tomme linjer etter hverandre i en fil, kan vi be «cat» om å bare vise én tom linje. La oss se på denne filen:
Den neste kommandoen vil få «cat» til å vise kun én tom linje fra hver gruppe med tomme linjer. Alternativet vi trenger er «-s» (klem-blank).
cat -s poem1.txt
Dette endrer ikke innholdet i filen, men kun hvordan «cat» viser filen.
Visning av tabulatorer
Hvis du vil vite om mellomrom er forårsaket av mellomromstasten eller tabulatorer, kan du bruke alternativet «-T» (vis-tabulatorer).
cat -T poem1.txt
Tabulatorer 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
Linjeslutter er representert med tegnet «$».
Kombinere filer
Det er ikke praktisk å ha et dikt lagret i to filer, med halve diktet i hver. La oss slå dem sammen til en ny fil som inneholder hele diktet.
cat poem1.txt poem2.txt > jabberwocky.txt
La oss bruke «cat» til å sjekke den nye filen:
cat jabberwocky.txt
Den nye filen inneholder nå innholdet fra begge de originale filene.
Legge til tekst til en eksisterende fil
Det er bedre, men det er faktisk 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 det til nederst i filen «jabberwocky.txt», så har vi hele diktet.
I den neste kommandoen må vi bruke «>>», ikke bare «>». Hvis vi bruker «>», vil vi overskrive «jabberwocky.txt». Det ønsker vi ikke. Vi ønsker å legge til tekst nederst i filen.
cat first_verse.txt >> jabberwocky.txt
La oss sjekke innholdet i «jabberwocky.txt» filen:
cat jabberwocky.txt
Nå er alle delene av diktet samlet.
Omdirigere standard inndata
Du kan omdirigere inndata 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
Vi kan begynne å skrive så snart vi har gitt kommandoen. Vi trykker Ctrl+D når vi er ferdige. Vi kan sjekke innholdet i den nye filen med:
cat my-poem.txt
Det høres ut som en fjern turbin. Det er sannsynligvis Lewis Carroll som snurrer rundt i graven sin i høy fart.
«tac»-kommandoen
«tac» er lik «cat», men den viser innholdet i filene i omvendt rekkefølge.
La oss se hvordan det fungerer:
tac my_poem.txt
Filen vises nå i omvendt rekkefølge i terminalvinduet. I dette tilfellet har det ingen innvirkning på de litterære kvalitetene.
«tac» med standard inndata
Hvis du bruker «tac» uten filnavn, vil den operere på inndata fra tastaturet. Ved å trykke Ctrl+D stopper du inndatafasen, og «tac» vil vise det du har skrevet inn i omvendt rekkefølge.
tac
Når Ctrl+D trykkes, reverseres inndataene og vises i terminalvinduet.
«tac» med loggfiler
Kan «tac» gjøre noe nyttig bortsett fra å være et morsomt triks? Ja, det kan den. Mange loggfiler legger de nyeste oppføringene nederst i filen. Ved å bruke «tac» (og, litt overraskende, «head») kan vi vise den nyeste oppføringen i terminalvinduet.
Vi bruker «tac» til å vise syslog-filen i revers, og sender resultatet videre til «head». Ved å be «head» om å kun skrive ut den første linjen den mottar (som takket være «tac» er den siste linjen i filen), kan vi se 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 «head» kun skriver ut én linje – slik vi ba om – men linjen er så lang at den brytes til to linjer. Det er derfor det ser ut som tre utdatalinjer i terminalvinduet.
«tac» med tekstposter
Det siste trikset «tac» har på lager er et ganske imponerende.
Vanligvis opererer «tac» på tekstfiler ved å behandle dem linje for linje, fra bunnen og opp. En linje er en sekvens av tegn som avsluttes med et linjeskifttegn. Men vi kan be «tac» om å jobbe med andre skilletegn. Dette gjør at vi kan behandle «deler» av data i tekstfilen som dataregistre.
La oss si at vi har en loggfil fra et program som vi må gå gjennom eller analysere. La oss ta en titt på formatet med «less».
less logfile.dat
Som vi ser, har filen et repeterende format. Det er sekvenser på tre linjer med heksadesimale verdier. Hvert sett med tre linjer med heksadesimale tall har en etikettlinje som begynner med «=SEQ», etterfulgt av en tallsekvens.
Hvis vi blar til bunnen av filen, kan vi se at det er mange av disse oppføringene. Den siste er nummerert 865.
La oss anta at vi, av en eller annen grunn, trenger å gå gjennom denne filen i omvendt rekkefølge, dataregister for dataregister. Linjerekkefølgen til de tre heksadesimale linjene i hvert dataregister må bevares.
Vi noterer oss at de tre siste linjene i filen begynner med de heksadesimale verdiene 93, E7 og B8, i den rekkefølgen.
La oss bruke «tac» for å reversere filen. Det er en veldig lang fil, så vi sender den til «less».
tac logfile.dat | less
Dette reverserer filen, men det er ikke resultatet vi ønsker. Vi ønsker at filen skal reverseres, men linjene i hvert dataregister må være i sin opprinnelige rekkefølge.
Vi registrerte tidligere at de tre siste linjene i filen begynner med heksadesimale verdier 93, E7 og B8, i den rekkefølgen. Rekkefølgen på disse linjene er snudd. I tillegg er «=SEQ»-linjene nå under hvert sett med tre heksadesimale linjer.
Her kommer «tac» til unnsetning:
tac -b -r -s ^=SEQ.+[0-9]+*$ logfile.dat | less
La oss bryte det ned:
Alternativet «-s» (separator) forteller «tac» hva vi vil bruke som skilletegn mellom dataregistrene våre. Det forteller «tac» at den ikke skal bruke det vanlige linjeskifttegnet, men et annet skilletegn i stedet.
Alternativet «-r» (regex) forteller «tac» at den skal behandle skilletegnstrengen som et regulært uttrykk.
Alternativet «-b» (før) får «tac» til å vise skilletegnet før hvert register i stedet for etter (som er standard for linjeskifttegnet).
-s (separator)-strengen «^=SEQ.+[0-9]+*$» kan dechiffreres slik:
Tegnet «^» representerer starten på linjen. Dette etterfølges av «=SEQ.+[0-9]+*». Dette instruerer «tac» om å se etter hver forekomst av «=SEQ.» i begynnelsen av en linje, etterfulgt av en sekvens av tall (angitt med [0-9]), og deretter en annen sekvens av tegn (indikert med *$).
Vi sender hele greia til «less» som vanlig.
Filen vår vises 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 hvert dataregister.
Vi kan enkelt sjekke dette. Den første verdien av de tre første linjene med heksadesimale tall (som var de tre siste linjene før filen ble reversert) samsvarer med verdiene vi noterte tidligere: 93, E7 og B8, i den rekkefølgen.
Dette er et ganske imponerende triks i en enkelt kommandolinje.
Alt har en hensikt
I Linux-verdenen kan selv de tilsynelatende enkleste kommandoene og verktøyene ha overraskende og kraftfulle egenskaper.
Designfilosofien om enkle verktøy som gjør én ting bra, og som enkelt kan samarbeide med andre verktøy, har ført til noen litt rare kommandoer, som «tac». Ved første øyekast virker den kanskje litt rar. Men når du ser under overflaten, finner du en uventet kraft som du kan utnytte.
Eller som en annen filosofi sier: «Ikke forakt slangen fordi den ikke har horn, for hvem sier at den ikke kan bli en drage?»