Hur man använder Linux cat and tac-kommandon

By rik

De små kommandona ’cat’ och ’tac’ används för att visa innehållet i textfiler. Men det finns mer i dem än vad man först kan ana. Låt oss utforska dessa kommandon och upptäcka några produktiva sätt att använda dem på Linux.

Dessa två kommandon kan verka enkla, men när du lär dig deras olika funktioner, inser du att de är kraftfulla verktyg när du arbetar med filer.

’cat’-kommandot

Vanligtvis används ’cat’ för att granska innehållet i textfiler och sammanfoga filer till en större enhet.

Förr i tiden, under modem-eran, delades binära filer upp i mindre delar för att förenkla nedladdningen. Istället för att ladda ner en stor fil, laddade man ner flera små. Om en fil misslyckades att ladda ner korrekt, behövde man bara hämta den filen igen.

Detta skapade behovet av ett sätt att återskapa de små filerna till den ursprungliga, fungerande binära filen. Processen kallades sammanlänkning och det var där ’cat’ kom in i bilden.

Med dagens bredbands- och fiberanslutningar, har behovet av denna funktion minskat. Men ’cat’ har fortfarande en betydande roll att spela.

Visa textfiler

För att visa innehållet i en textfil med ’cat’, använder du följande kommando:

Se till att filen är en textfil. Att försöka visa innehållet i en binär fil kan ge oförutsägbara resultat och leda till en låst terminalsession.

cat poem1.txt

Filen poem1.txt visas nu i terminalfönstret.

Detta är bara halva dikten. För att visa hela dikten, som är uppdelad i två filer, kan vi lista båda filerna i kommandot:

cat poem1.txt poem2.txt

Nu visas hela dikten.

Använda ’cat’ med ’less’

Dikten visades för snabbt, och de första verserna försvann från skärmen. För att kunna läsa i lugn och ro, kan vi skicka utdata från ’cat’ till ’less’, och scrolla i egen takt:

cat poem1.txt poem2.txt | less

Vi kan nu enkelt navigera fram och tillbaka genom texten, även om den är uppdelad i flera filer.

Numrera rader

Vi kan få ’cat’ att numrera raderna i filen med hjälp av alternativet ’-n’:

cat -n poem1.txt

Nu är raderna numrerade i terminalfönstret.

Numrera endast icke-tomma rader

De tomma raderna räknas också. För att bara numrera textrader kan vi använda alternativet ’-b’:

cat -b poem1.txt

Nu är endast textraderna numrerade.

Hantera flera tomma rader

Om det finns flera tomma rader efter varandra, kan ’cat’ ignorera alla utom en. Låt oss titta på följande fil:

Med alternativet ’-s’ kan vi minska antalet tomma rader:

cat -s poem1.txt

Detta påverkar inte filens innehåll, utan endast hur ’cat’ visar den.

Visa tabbar

För att se skillnaden mellan blanksteg och tabbar, kan vi använda alternativet ’-T’.

cat -T poem1.txt

Tabbar representeras av tecknen ”^I”.

Visa radslut

För att kontrollera om det finns tomma utrymmen i slutet av raderna, kan vi använda ’-E’.

cat -E poem1.txt

Radsluten representeras av tecknet ”$”.

Sammanfoga filer

Dikten är uppdelad i två filer. Vi kan sammanfoga dem till en ny fil, med hela dikten samlad:

cat poem1.txt poem2.txt > jabberwocky.txt

Låt oss kontrollera den nya filen:

cat jabberwocky.txt

Den nya filen innehåller nu innehållet från de två tidigare filerna.

Lägga till text i en fil

Vi saknar den sista versen. Vi kan lägga till den till filen genom att använda ’>>’. Om vi endast använder ’>’ kommer filen att skrivas över. Vi vill bara lägga till text i filen.

cat first_verse.txt >> jabberwocky.txt

Låt oss kolla innehållet i filen:

cat jabberwocky.txt

Nu har vi hela dikten.

Omdirigera ’stdin’

Vi kan även omdirigera inmatning från tangentbordet till en fil. Allt vi skriver kommer att hamna i filen tills vi trycker Ctrl+D.

cat > my_poem.txt

Vi kan börja skriva direkt efter kommandot. När vi är klara, trycker vi på Ctrl+D. Vi kan sedan kontrollera innehållet i filen med:

cat my_poem.txt

Detta är ett annat sätt att skapa filer.

’tac’-kommandot

’tac’ fungerar som ’cat’, men listar innehållet i filerna i omvänd ordning.

Låt oss titta på ett exempel:

tac my_poem.txt

Filen visas nu i omvänd ordning i terminalfönstret. I det här fallet påverkar det inte dess innehåll.

Använda ’tac’ med ’stdin’

Om vi använder ’tac’ utan ett filnamn, kommer den att bearbeta inmatning från tangentbordet. När vi trycker på Ctrl+D avslutas inmatningsfasen och ’tac’ listar allt vi har skrivit i omvänd ordning.

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? Ja, absolut. Många loggfiler lägger till ny information i slutet av filen. Med ’tac’ och ’head’ kan vi se den senaste posten i terminalen.

Vi använder ’tac’ för att lista ’syslog’ i omvänd ordning, och skickar den till ’head’. Genom att bara få ’head’ att skriva ut första raden, kommer vi se den sista raden i filen tack vare ’tac’.

tac /var/log/syslog | head -1

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

Observera att ’head’ endast skriver ut en rad, men raden är så lång att den slingrar sig över flera rader i terminalfönstret.

Använda ’tac’ med textposter

Det sista tricket är ett riktigt mästerverk.

Vanligtvis arbetar ’tac’ med textfiler rad för rad, nerifrån och upp. Men vi kan be ’tac’ att använda andra avgränsare. Detta låter oss behandla ”bitar” av data i textfilen som separata poster.

Anta att vi har en loggfil från ett program som vi vill granska. Låt oss undersöka dess format med ’less’.

less logfile.dat

Som vi kan se, har filen ett repetetivt format. Det finns sekvenser av tre rader med hexadecimala värden. Varje set med tre rader har en etikett som börjar med ”=SEQ” följt av en sekvens med siffror.

Om vi scrollar till botten av filen, ser vi att det finns många poster. Den sista är numrerad 865.

Låt oss anta att vi behöver gå igenom filen i omvänd ordning, datapost för datapost. Radernas ordning i varje post måste vara i rätt ordning.

De tre sista raderna i filen börjar med de hexadecimala värdena 93, E7 och B8, i den ordningen.

Låt oss använda ’tac’ för att vända filen, och sedan visa den med ’less’ eftersom det är en lång fil.

tac logfile.dat | less

Filen vänds, men det är inte det vi vill ha. Vi vill vända filen men behålla ordningen inom varje post.

Vi noterade tidigare att de tre sista raderna i filen börjar med de hexadecimala värdena 93, E7 och B8. Ordningen på dessa rader har ändrats. Dessutom är ”=SEQ”-raderna under varje set med tre hexadecimala rader.

Lösningen är ’tac’!

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

Låt oss dela upp det här kommandot:

Alternativet ’-s’ (separator) informerar ’tac’ om vilken avgränsare vi vill använda. Den säger åt ’tac’ att inte använda det vanliga nyradstecknet, utan vår egen separator.

Alternativet ’-r’ (regex) säger åt ’tac’ att behandla separatorsträngen som ett reguljärt uttryck.

Alternativet ’-b’ (before) gör att ’tac’ listar avgränsaren före varje post istället för efter (som är standard för nyradstecken).

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

Tecknet ^ representerar början av raden. Den 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 en sekvens med siffror (anges med [0-9]), och följt av valfri uppsättning tecken (anges med *$).

Allt visas med ’less’ som vanligt.

Nu presenteras filen i omvänd ordning, med varje ”=SEQ”-etikett innan varje grupp med hexadecimal data. De tre hexadecimala raderna är i sin ursprungliga ordning.

Vi kan kontrollera att första värdena i de första tre raderna av hexadecimal data matchar vad vi noterade tidigare: 93, E7 och B8 i den ordningen.

Detta är en imponerande one-liner i terminalen.

Allt har ett syfte

I Linux-världen kan även de enklaste kommandon ha oväntade och kraftfulla funktioner.

Designfilosofin med enkla verktyg som gör en sak bra och enkelt kan samarbeta med andra verktyg, har gett oss verktyg som ’tac’. Det kan verka lite underligt först, men under ytan finns en oväntad kraft att utnyttja.

Eller, som en annan filosofi säger: ”Förakta inte ormen för att den saknar horn, för vem kan säga att den inte ska bli en drake?”