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.