Linux-kommandoen `tail` presenterer data fra slutten av en fil. Den kan til og med vise endringer som legges til en fil i sanntid. Vi skal nå utforske hvordan du kan utnytte denne kommandoen effektivt.
Er `tail` fortsatt relevant?
`tail`-kommandoen gir deg innsikt i data som finnes på slutten av en fil. Siden nye data som regel skrives til slutten av en fil, er `tail` en rask og enkel metode for å observere de siste tilleggene. Den kan også overvåke en fil og vise nye tekstlinjer etter hvert som de dukker opp. Dette gjør den til et nyttig verktøy for overvåking av loggfiler.
Mange moderne Linux-distribusjoner benytter `systemd` som system- og tjenestebehandler. Dette er den første prosessen som kjøres, den har prosess-ID 1, og er overordnet alle andre prosesser. Tidligere ble denne funksjonen ivaretatt av det eldre `init`-systemet.
Med denne endringen fulgte et nytt format for systemloggfiler. De lagres ikke lenger i ren tekst, men i et binært format under `systemd`. For å lese disse loggfilene, må man bruke `journalctl`-verktøyet. `tail`-kommandoen fungerer med rene tekstformater og kan ikke lese binære filer. Betyr dette at `tail`-kommandoen er overflødig? Har den fortsatt noe å tilby?
`tail`-kommandoen kan mer enn bare å vise sanntidsoppdateringer. I tillegg finnes det fortsatt mange loggfiler som ikke er systemgenerert, og som lagres som vanlige tekstfiler. Loggfiler generert av applikasjoner har for eksempel ikke endret format.
Bruke `tail`
Når du sender navnet på en fil til `tail`, vil den vise de ti siste linjene fra denne filen. Eksempelfilene vi bruker inneholder lister med ord sortert alfabetisk. Hver linje er nummerert, noe som gjør det enkelt å følge eksemplene og observere effekten av de ulike alternativene.
tail word-list.txt
For å vise et annet antall linjer, bruk alternativet `-n` (antall linjer):
tail -n 15 word-list.txt
Du kan faktisk utelate `-n` og bare bruke en bindestrek `-` etterfulgt av tallet. Pass på at det ikke er mellomrom mellom dem. Teknisk sett er dette en eldre kommandosyntaks, men den finnes fortsatt i manualsiden og fungerer fortsatt.
tail -12 word-list.txt
Bruke `tail` med flere filer
Du kan bruke `tail` til å jobbe med flere filer samtidig. Bare legg til filnavnene på kommandolinjen:
tail -n 4 list-1.txt list-2.txt list-3.txt
En liten overskrift vises for hver fil slik at du ser hvilken fil linjene tilhører.
Vise linjer fra starten av en fil
Modifikatoren `+` (tell fra starten) får `tail` til å vise linjer fra starten av en fil, og begynner på et spesifikt linjenummer. Hvis filen er veldig lang og du velger en linje nær starten av filen, vil du få mye output i terminalvinduet. I slike tilfeller kan det være lurt å sende outputen fra `tail` til `less`.
tail +440 list-1.txt
Du kan bla gjennom teksten på en kontrollert måte.
Siden det tilfeldigvis er 20 445 linjer i denne filen, tilsvarer denne kommandoen å bruke `-6`-alternativet:
tail +20440 list-1.txt
Bruke byte med `tail`
Du kan instruere `tail` til å bruke byteforskyvninger i stedet for linjer ved å bruke alternativet `-c` (byte). Dette kan være nyttig hvis du har en tekstfil som er formatert i faste størrelser. Vær oppmerksom på at et linjeskifttegn teller som én byte. Denne kommandoen viser de siste 93 bytene i filen:
tail -c 93 list-2.txt
Du kan kombinere alternativet `-c` (byte) med `+` (tell fra starten av filen), og spesifisere en forskyvning i antall byte fra starten av filen:
tail -c +351053 list-e.txt
Piping inn i `tail`
Vi har tidligere sendt output fra `tail` til `less`. Vi kan også sende output fra andre kommandoer til `tail`.
For å identifisere de fem eldste filene eller mappene, bruk alternativet `-t` (sorter etter endringstid) med `ls`, og pipe outputen til `tail`.
ls -tl | tail -5
Hovedkommandoen viser linjer med tekst fra starten av en fil. Vi kan kombinere dette med `tail` for å trekke ut en del av filen. Her bruker vi `head`-kommandoen for å trekke ut de første 200 linjene fra en fil. Dette sendes videre til `tail`, som trekker ut de siste ti linjene. Dette gir oss linje 191 til linje 200, de siste ti linjene av de første 200 linjene:
head -n 200 list-1.txt | tail -10
Denne kommandoen viser de fem prosessene som bruker mest minne.
ps aux | sort -nk +4 | tail -5
La oss bryte det ned.
`ps`-kommandoen viser informasjon om kjørende prosesser. Alternativene som brukes er:
a: | List opp alle prosesser, ikke bare for gjeldende bruker. |
u: | Vis en brukerorientert output. |
x: | List opp alle prosesser, inkludert de som ikke kjører i en TTY. |
Sorteringskommandoen sorterer outputen fra `ps`. Alternativene vi bruker med `sort` er:
n: | Sorter numerisk. |
k +4: | Sorter på den fjerde kolonnen. |
`tail -5`-kommandoen viser de siste fem prosessene fra den sorterte outputen. Dette er de fem prosessene som bruker mest minne.
Bruke `tail` for å spore filer i sanntid
Det er enkelt å spore nye tekstoppføringer som kommer inn i en fil – vanligvis en loggfil – med `tail`. Send filnavnet på kommandolinjen og bruk `-f` (følg) alternativet.
tail -f geek-1.log
Hver gang en ny loggoppføring legges til i loggfilen, oppdaterer `tail` visningen i terminalvinduet.
Du kan avgrense outputen til kun å inkludere linjer som er av spesiell relevans. Her bruker vi `grep` for å vise kun linjer som inneholder ordet «gjennomsnittlig»:
tail -f geek-1.log | grep average
For å følge endringene i to eller flere filer, sender du filnavnene på kommandolinjen:
tail -f -n 5 geek-1.log geek-2.log
Hver oppføring er merket med en overskrift som viser hvilken fil teksten kom fra.
Visningen oppdateres hver gang en ny oppføring kommer i en fulgt fil. For å spesifisere oppdateringsperioden, bruk alternativet `-s` (soveperiode). Dette forteller `tail` å vente et antall sekunder, fem i dette eksemplet, mellom filkontroller.
tail -f -s 5 geek-1.log
Selv om det ikke er synlig i skjermbildet, skjer filoppdateringene hvert sekund. De nye filoppføringene vises i terminalvinduet hvert femte sekund.
Når du følger teksttilføyelser til mer enn én fil, kan du undertrykke overskriftene som indikerer hvilken loggfil teksten kom fra. Bruk alternativet `-q` (stille) for å gjøre dette:
tail -f -q geek-1.log geek-2.log
Utdataene fra filene vises i en sømløs blanding av tekst. Det er ingen indikasjon på hvilken loggfil hver oppføring kom fra.
`tail` har fortsatt verdi
Selv om tilgang til systemloggfiler nå tilbys av `journalctl`, har `tail` fortsatt mye å tilby. Dette gjelder spesielt når den brukes sammen med andre kommandoer, enten ved å sende outputen inn eller ut av `tail`.
Systemd har kanskje endret landskapet, men det er fortsatt plass til tradisjonelle verktøy som følger Unix-filosofien om å gjøre én ting og gjøre det bra.