På denne siden

Verktøyene i dette kapittelet gjør tekst om til strukturert data. De er byggesteinene i Unix-filosofien: hver gjør én ting godt, og de kobles sammen med pipes (|).

grep — søk etter tekst

grep skriver ut linjer som matcher et mønster.

$ grep apple fruits.txt
apple
apple
apple

Vanlige flagg:

Flagg Betydning
-i skiller ikke mellom store og små bokstaver
-n vis linjenummer
-c tell antall treff i stedet for å skrive ut
-v inverter: skriv ut linjer som IKKE matcher
-r søk rekursivt gjennom mapper
-l skriv ut bare navnene på filene med treff (ikke linjene)
$ grep -n apple fruits.txt
1:apple
4:apple
6:apple

grep -r søker i et helt mappetre:

$ grep -r "error" /var/log/

Kombiner -r og -l for å liste hvilke filer som inneholder et treff, uten å skrive ut selve linjene:

$ grep -rl "error" /var/log/

sed — strømredigerer

sed redigerer tekst linje for linje. Den vanligste bruken er søk-og-erstatt.

$ sed "s/apple/pear/" fruits.txt
pear
banana
cherry

sed endrer bare det første treffet per linje; legg til g for å erstatte alle:

$ sed "s/apple/pear/g" fruits.txt

Skriv ut en bestemt linje med -n og en linjeadresse:

$ sed -n "2p" fruits.txt
banana

Slett en linje med d:

$ sed "2d" fruits.txt

For å redigere en fil på plass (uten utdata til skjermen), bruk -i:

$ sed -i "s/cherry/peach/" fruits.txt

Forsiktig: sed -i overskriver den opprinnelige filen — lag en sikkerhetskopi med -i.bak hvis du er usikker.

awk — feltbasert behandling

awk jobber med linjer delt inn i felt. Som standard er feltene adskilt med mellomrom og nummerert fra $1.

$ printf "alice 10\nbob 20\n" | awk '{print $1}'
alice
bob

(printf skriver ut med escapes — \n er et linjeskift. Det er den forutsigbare slektningen til echo -e fra kapittel 4, og det tradisjonelle valget i pipelines.)

Skriv ut en kolonne etter nummer:

$ awk '{print $2}' scores.txt

Med et tilpasset skilletegn bruker du -F:

$ echo "a:b:c" | awk -F: '{print $2}'
b

awk kan regne over linjer med END:

$ awk '{sum += $2} END {print sum}' scores.txt
30

cut — hent ut kolonner

cut trekker ut felt etter skilletegn. Spesifiser skilletegnet med -d og feltene med -f:

$ printf "a,b,c\nd,e,f\n" | cut -d, -f2
b
e

sort — sorter linjer

sort sorterer linjer alfabetisk.

$ sort fruits.txt
apple
apple
apple
banana
Flagg Betydning
-n numerisk sortering
-r omvendt
-h human-numerisk: 2K sorteres før 1M (passer sammen med du -h)
-k sorter etter en bestemt kolonne
$ sort -n numbers.txt
$ sort -r fruits.txt

uniq — fjern duplikater

uniq fjerner tilstøtende duplikatlinjer. Siden duplikater vanligvis ikke ligger ved siden av hverandre, kombineres den nesten alltid med sort:

$ sort fruits.txt | uniq
apple
banana
cherry
date

Tell forekomster med -c:

$ sort fruits.txt | uniq -c
      3 apple
      1 banana
      1 cherry
      1 date

wc — ordtelling

wc teller linjer, ord og bytes.

$ wc fruits.txt
 6  6 37 fruits.txt

Bruk -l for kun linjer:

$ wc -l fruits.txt
6 fruits.txt

Et vanlig mønster: telle hvor mange filer som er i en mappe:

$ ls | wc -l

Flere tekstverktøy

Noen flere verktøy som dukker opp overalt i shell-arbeidsflyter:

diff viser forskjellene mellom to filer:

$ diff old.txt new.txt

tac skriver ut en fil i omvendt linjerekkefølge (det er cat baklengs):

$ tac notes.txt

nl nummererer linjene i en fil:

$ nl notes.txt
     1  first line
     2  second line

tr oversetter tegn — bytt ett tegnsett mot et annet, eller klem gjentakelser ned til én:

$ echo hello | tr a-z A-Z
HELLO
$ echo "a  b  c" | tr -s " "
a b c

column -t justerer tekstkolonner til en pen tabell:

$ printf "alice 10\nbob 20\n" | column -t
alice  10
bob    20

watch kjører en kommando gjentatte ganger og viser den skiftende utdataen på skjermen — praktisk for å følge en verdi over tid:

$ watch free -h

Trykk Ctrl+C for å stoppe watch.

comm sammenligner to sorterte filer, og viser linjer som er unike for hver fil og linjer som finnes i begge:

$ comm sorted1.txt sorted2.txt

xargs gjør standardinndataen sin om til argumenter for en annen kommando. Det er kraftverktøyet for å behandle en liste med elementer, for eksempel filer funnet av find:

$ find . -name "*.log" | xargs rm

Sett det sammen

Disse verktøyene kombineres naturlig. For eksempel de fem vanligste ordene i en fil:

$ tr -s ' ' '\n' < guide.txt | sort | uniq -c | sort -nr | head -5

Les den fra venstre til høyre: tr gjør hvert mellomrom om til et linjeskift (ett ord per linje), og < sender guide.txt inn i den — inputredireksjon, kapittel 13 sin > med pilen snudd. Så samler sort like ord ved siden av hverandre, uniq -c teller dem, og sort -nr rangerer etter antall.