Linux-kommandoen `look` analyserer en fil og viser alle linjer som starter med et spesifikt ord eller en frase. Det er imidlertid viktig å merke seg at oppførselen kan variere mellom ulike Linux-distribusjoner. Denne veiledningen forklarer hvordan du effektivt bruker `look` kommandoen.
Ulik oppførsel i Ubuntu
Denne tilsynelatende enkle, men svært anvendelige kommandoen, viste seg å være mer komplisert enn først antatt. Det oppstod to hovedproblemer: kompatibilitet og manglende presis dokumentasjon.
Artikkelen er testet med Ubuntu, Fedora og Manjaro. `look` kommandoen var tilgjengelig i alle disse distribusjonene, men oppførselen varierte. Spesielt Ubuntu-versjonen skilte seg betydelig ut. Til tross for det Ubuntu Manpages indikerer, er oppførselen ikke den samme som de andre.
Etter nærmere undersøkelse ble det klart at standard `look` implementerer en binær søkealgoritme, mens Ubuntu-versjonen bruker en lineær søkealgoritme. De offisielle Ubuntu manualsidene for Bionic Beaver (18.04), Cosmic Cuttlefish (18.10) og Disco Dingo (19.04) hevder at binært søk brukes, noe som ikke stemmer.
Den lokale man-siden for Ubuntu bekrefter at deres `look` benytter et lineært søk. Det finnes imidlertid et kommandolinjealternativ for å tvinge kommandoen til å bruke binært søk. Ingen av de andre distribusjonenes versjoner gir dette valget.
man look
Når vi leser gjennom man-siden, finner vi avsnittet som beskriver bruken av lineært søk i denne versjonen av `look`.
Konklusjonen er: sjekk alltid de lokale man-sidene først.
Lineært vs. binært søk
Binært søk er raskere og mer effektivt enn lineært søk, spesielt ved behandling av store filer. Ulempen er at filen må være sortert. Hvis du ikke vil sortere filen direkte, kan du sortere en kopi for bruk med `look`.
Dette vil bli demonstrert senere i artikkelen. Vær oppmerksom på at i Fedora, Manjaro og i de fleste andre Linux-distribusjoner må du sortere en kopi av filen for å oppnå optimal ytelse.
Installere «words»
`look` kan brukes med en hvilken som helst tekstfil eller med den lokale ordlistefilen «words».
På Manjaro må du installere «words»-filen. Bruk følgende kommando:
sudo pacman -Syu words
Bruk av `look`
I denne artikkelen bruker vi en tekstfil med Edward Lear sitt dikt «The Jumblies».
Vi viser innholdet med kommandoen:
less the-jumblies.txt
Her vises begynnelsen av diktet. Merk at vi bruker Ubuntu, derfor er filen usortert. I Fedora og Manjaro ville vi jobbet med en sortert kopi, som vi ser nærmere på senere.
Hvis vi leter etter linjer som begynner med ordet «De», kan vi se hva Jumblies gjorde.
look They the-jumblies.txt
`look` viser deretter disse linjene:
Ignorere store og små bokstaver
For å instruere `look` om å ignorere forskjell mellom store og små bokstaver, bruk flagget `-f`. Vi bruker «de» som søkeord igjen, men denne gangen med små bokstaver.
look -f they the-jumblies.txt
Denne gangen inkluderer resultatet en ekstra linje.
Linjen som begynner med «DE» ble utelatt i forrige resultatet, da den var skrevet med store bokstaver og ikke stemte overens med søkeordet «De».
Ved å ignorere store og små bokstaver kan `look` inkludere linjen i resultatet.
Bruke `look` med en sortert fil
Hvis din Linux-distribusjon bruker en versjon av `look` som følger den tradisjonelle oppførselen med binært søk, må du enten sortere filen eller bruke en sortert kopi.
La oss gjenta kommandoen for å søke etter «De», denne gangen i Manjaro.
Som du ser, ble ingen resultater returnert. Vi vet at det finnes linjer i diktet som starter med ordet «De».
La oss lage en sortert kopi av filen. Hvis du planlegger å bruke flaggene `-f` (ignorere store og små bokstaver) eller `-d` (kun alfanumeriske tegn og mellomrom), må du også bruke disse når du sorterer filen.
Flagget `-o` (utdata) gir deg muligheten til å angi navnet på filen som skal lagre de sorterte linjene. I dette eksempelet kaller vi den «sorted.txt».
sort -f -d the-jumblies.txt -o sorted.txt
La oss se på innholdet i sorted.txt, og deretter bruke `-f` og `-d` flaggene.
Nå får vi de forventede resultatene.
Vurder kun alfanumeriske tegn og mellomrom
For å få `look` til å ignorere alt som ikke er et alfanumerisk tegn eller et mellomrom, bruk flagget `-d` (alfanumerisk).
La oss se om det finnes ord som begynner med «Oh.»
look -f oh the-jumblies.txt
Ingen resultater returneres av `look`.
La oss prøve igjen og instruere `look` om å ignorere alt unntatt alfanumeriske tegn og mellomrom. Det vil si at tegn og symboler, som for eksempel tegnsetting, vil bli ignorert.
look -f -d oh the-jumblies.txt
Denne gangen får vi et resultat. Vi fant ikke denne linjen tidligere fordi anførselstegn og utropstegn hindret søket.
Spesifisere avslutningstegn
Du kan angi et spesifikt avslutningstegn for `look`. Vanligvis brukes mellomrom og linjeslutt som avslutningstegn.
Flagget `-t` (terminate character) lar oss definere ønsket avslutningstegn. I dette eksemplet bruker vi apostrof-tegnet. Vi må escape det med en skråstrek slik at `look` vet at vi ikke åpner en streng.
Vi siterer også søkeordet fordi det inneholder et mellomrom. Vi søker etter to ord.
look -f -t \' "they call" the-jumblies.txt
Resultatene samsvarer med søkeordet og avsluttes med apostrofen som ble angitt som avslutningstegn.
Bruke `look` uten fil
Hvis du ikke oppgir et filnavn i kommandolinjen, bruker `look` standard ordfilen.
Kommandoen:
Gir disse resultatene:
Dette er alle ordene i ordlisten som begynner med «circle».
Avsluttende ord
Det er alt om `look`.
Det er ganske enkelt når du forstår at det er forskjellig oppførsel mellom ulike Linux-distribusjoner, og du har avklart om din versjon bruker binært eller lineært søk.