Linux-kommandot `look` granskar en textfil och presenterar alla rader som inleds med ett angivet ord eller en specifik fras. Det är dock viktigt att notera att dess funktion kan variera mellan olika Linux-distributioner. Denna guide kommer att visa dig hur du använder det på ett effektivt sätt.
`look`-kommandots variationer i Ubuntu
Detta till synes enkla, men praktiska kommando, gav mig en hel del huvudbry under undersökningen inför denna artikel. Det visade sig att det fanns två utmaningar: kompatibilitet och dokumentation.
Jag testade kommandot på Ubuntu, Fedora och Manjaro. `look` var närvarande i samtliga distributioner, vilket var positivt. Problemet låg i att beteendet skilde sig åt mellan dem. Ubuntu-versionen var märkbart annorlunda, trots att Ubuntu Manpages indikerar att beteendet borde vara konsekvent.
Efter en del efterforskning kom jag fram till att `look` traditionellt använder en binär sökalgoritm, medan Ubuntu-versionen använder en linjär sökalgoritm. Trots detta anger Ubuntu-man-sidorna online för Bionic Beaver (18.04), Cosmic Cuttlefish (18.10) och Disco Dingo (19.04) att versionen använder en binär sökning, vilket alltså inte stämmer.
Om vi konsulterar den lokala Ubuntu-man-sidan, framgår det tydligt att deras version av `look` använder en linjär sökning. Det finns dock ett kommandoradsalternativ för att tvinga den att använda en binär sökning. De andra distributionerna saknar möjligheten att växla mellan sökalternativen.
man look
Genom att scrolla ner genom man-sidan hittar vi avsnittet som beskriver att denna version av `look` använder en linjär, i stället för en binär sökning.
Lärdomen av detta är att alltid kontrollera de lokala man-sidorna först.
Linjär sökning kontra binär sökning
Den binära sökmetoden är generellt snabbare och effektivare än en linjär sökning. Detta blir tydligt när man arbetar med stora filer. Nackdelen med binär sökning är att filen måste vara sorterad. Om du inte vill sortera din originalfil, kan du sortera en kopia och använda den med `look`.
Detta kommer att demonstreras senare i artikeln. Det är viktigt att veta att på Fedora, Manjaro, och sannolikt de flesta andra Linux-distributioner, behöver du skapa en sorterad kopia av filen för att kunna använda den med `look`.
Installation av ordlista
Kommandot `look` kan användas med valfri textfil, eller med den lokala ordlistefilen ”words”.
På Manjaro behöver du installera ”words”-filen. Du kan göra det med följande kommando:
sudo pacman -Syu words
Användning av `look`
I denna artikel kommer vi att använda en textfil med Edward Lears dikt ”The Jumblies”.
Vi kan visa dess innehåll med följande kommando:
less the-jumblies.txt
Här är den första delen av dikten. Notera att vi använder Ubuntu, så filen är inte sorterad. På Fedora och Manjaro skulle vi arbeta med en sorterad kopia av filen, vilket vi kommer att gå igenom senare i denna artikel.
Om vi letar efter rader som börjar med ordet ”De”, får vi reda på en del av vad Jumblies gjorde.
look They the-jumblies.txt
`look` svarar genom att lista dessa rader:
Ignorera skillnader i versaler och gemener
För att instruera `look` att ignorera skillnader mellan versaler och gemener, använd alternativet `-f` (ignorera case). Vi har använt ”de” som sökord igen, men den här gången med gemener.
look -f they the-jumblies.txt
Denna gång inkluderar resultatet en extra rad.
Raden som börjar med ”DE” missades i det tidigare resultatet eftersom den är skriven med versaler och därmed inte matchade vårt sökord ”de”.
Genom att ignorera skiftläge kan `look` inkludera den i resultaten.
Använda `look` med en sorterad fil
Om din Linux-distribution har en version av `look` som följer det traditionella beteendet att använda en binär sökning, måste du antingen sortera filen eller arbeta med en sorterad kopia av den.
Låt oss repetera kommandot för att söka efter ”De”, men denna gång på Manjaro.
Som du ser returnerades inga resultat. Men vi vet att det finns rader i dikten som börjar med ordet ”De”.
Låt oss göra en sorterad kopia av filen. Om du ska använda alternativen `-f` (ignorera skiftläge) eller `-d` (endast alfanumeriska tecken och mellanslag) med `look`, måste du använda dem även när du sorterar filen.
Alternativet `-o` (output) låter dig specificera namnet på filen som de sorterade raderna ska läggas till. I det här exemplet är det ”sorted.txt.”
sort -f -d the-jumblies.txt -o sorted.txt
Låt oss titta på filen sorted.txt och sedan använda `-f` och `-d` alternativen.
Nu får vi de resultat vi förväntade oss.
Beakta enbart mellanslag och alfanumeriska tecken
För att instruera `look` att ignorera allt som inte är ett alfanumeriskt tecken eller ett mellanslag, använd alternativet `-d` (alfanumeriskt).
Låt oss undersöka om det finns några ord som börjar med ”Oh.”
look -f oh the-jumblies.txt
Inga resultat returneras av `look`.
Låt oss försöka igen och instruera `look` att ignorera allt annat än alfanumeriska tecken och mellanslag. Det betyder att tecken och symboler, såsom skiljetecken, kommer att ignoreras.
look -f -d oh the-jumblies.txt
Denna gång får vi ett resultat. Vi hittade inte denna rad tidigare eftersom citattecken och utropstecken påverkade sökningen.
Specificera avslutande tecken
Du kan ange för `look` att använda ett specifikt tecken som avslutande tecken. Vanligtvis används mellanslag och radslut som avslutande tecken.
Alternativet `-t` (terminate character) låter oss specificera vilket tecken vi vill använda. I detta exempel kommer vi att använda apostroftecknet. Vi måste skydda det med ett snedstreck så att `look` förstår att vi inte öppnar en sträng.
Vi skyddar även söktermen eftersom den innehåller ett mellanslag. Vi söker efter två ord.
look -f -t \' "they call" the-jumblies.txt
Resultaten matchar söktermen, avslutad av apostrofen som vi angav som avslutande tecken.
Använda `look` utan fil
Om du inte anger ett filnamn på kommandoraden använder `look` ordlistefilen.
Kommandot:
ger följande resultat:
Detta är alla ord i filen som börjar med ordet ”cirkel”.
Sammanfattning
Det är i princip allt som `look` handlar om.
Det är ganska okomplicerat när du väl känner till att beteendet kan skilja sig mellan olika Linux-distributioner och att du har undersökt om din version använder en binär eller linjär sökning.