21. december

cat, head og tail

I dag skal vi se på de tre programmer cat, head og tail. Det første lever en ret overset tilværelse, men har alligevel nogle muligheder der kan gøre det interessant at se på. head og tail er mere anerkendte som nyttige værktøjer.

cat

cat er en forkortelse for concatenate, dette er også den oprindelige simple opgave som cat udførte. For at sætte filerne foo og bar sammen til filen foobar skriver man følgende:

$ cat foo bar > foobar

Ofte bruger man også cat som første led i en pipeline, for eksempel hvis man skal behandle en logfil:

$ cat access_log | grep "GET /foobar" | cut -d" " -f 1

(nogle kalder dette at misbruge cat. Det kan jo gøres lige så let uden)

cat har dog nogle egenskaber, der gør at det er anvendeligt i en række andre tilfælde end bare til at sætte filer sammen med. For eksempel vil flaget -n nummerere filens linjer:

$ cat foobar
foo
bar
$ cat -n foobar
     1  foo
     2  bar

cat kan også sættes til at sætte et dollartegn i slutningen af hver linje. På denne måde kan man finde linjer, der kun består at mellemrumstegn eller har mellemrumstegn sidst på linjen. Dette gøres med -E.

Enkelte programmer gør forskel på mellemrumstegn og tabulatortegn (blandt andet i Makefiles). Man kan få cat til at markerer tabulatortegn med et ^I med flaget -T.

Så er der en masse andre tegn man normalt ikke kan se i filer. Disse kan vises med cat med flaget -v. Så kan de ellers usynlige tegn skrevet med et ^-tegn foran eller med M- foran. Desvære ødelægger dette danske bogstaver så æøå bliver skrevet som M-fM-xM-e.

Disse tre flag der viser skjulte ting kan slås til på en gang med flaget -A

head

Ofte er man kun interesseret i begyndelsen af en fil, dette er en opgave for programmet head. Normalt skriver head bare de første 10 linjer ud, er man interesseret i flere eller færre linjer kan man angive dette med flaget -n. Det følgende vil for eksempel skrive det 15 første linjer af foobar ud:

$ head -n 15 foobar

Er det ikke antallet af linjer man er interesseret i (det kan være at det slet ikke er en tekstfil så linjer slet ikke giver nogen mening) kan man bruge flaget -c til at angive hvor meget der skal skrives ud. Følgende vil skrive de første 100 tegn ud af filen foobar:

$ head -c 100 foobar

Når man bruger flaget -c kan man sætte et k efter tallet for kilobytes og m for megabytes. De første 10 kilobytes af foobar kan altså findes således:

$ head -c 10k foobar

Hvis man skriver flere filnavne som argument til head vil head adskille de enkelte filer med en linje, der siger hvilken fil den tager linjer fra. Dette kan slås fra med flaget -s.

tail

tail kan det samme som head men virker dog, indlysende nok, på slutningen af filen. Følgende skriver de sidste 5 linjer af foobar ud:

$ tail -n 5 foobar

Både -n og -c virker på samme måde som under head. Dog med den udvidelse at hvis man skriver tail -n +10 foobar vil den ikke skrive de 10 sidste linjer ud, men skrive ud fra linje 10 (talt fra begyndelsen). Det samme kan lade sig gøre med -c.

tail har dog en interessant ekstra mulighed. Med flaget -f kan man få tail til at følge en fil. Det vil sige at i stedet for bare at skrive de sidste par linjer ud og færdig, så vil tail holde øje med om der bliver skrevet mere til filen og så skrive det ud. Dette er genialt til at holde øje med logfiler. Åbn et vindue og skrive følgende:

$ tail -f /var/logs/apache/access_log

Og du vil hele tiden kunne følge med i hvad din webserver laver. Hvis man skriver flere filer efter tail kan man følge med i flere filer da head pænt vil skrive en header ud hver gang den skriver fra en fil. På denne måde kan man holde øje med flere logfiler på en gang.