Hur man använder kommandot uniq på Linux

By rik

Linux-kommandot uniq är ett kraftfullt verktyg för att analysera textfiler och identifiera unika eller duplicerade rader. Denna guide utforskar dess mångsidighet och funktioner, och visar hur du kan dra full nytta av detta praktiska verktyg.

Hitta sammanfallande textrader i Linux

Kommandot uniq är effektivt, anpassningsbart och utmärkt på det det gör. Liksom många andra Linux-kommandon har det dock vissa särdrag som är bra att känna till. Om man använder det utan förkunskaper kan resultatet verka förbryllande. Vi kommer att lyfta fram dessa särdrag i texten.

Uniq passar perfekt in i ”gör en sak och gör det bra”-filosofin. Därför är det även mycket väl lämpat för användning i rörledningar där det kan agera som en del i komplexa kommandokedjor. En av dess vanligaste kompanjoner är kommandot sort, eftersom uniq kräver sorterad data för att fungera korrekt.

Låt oss börja utforska!

Använda uniq utan tillval

Vi har en textfil som innehåller texten till Robert Johnsons låt ”I believe I’ll dust my broom”. Låt oss se vad uniq kan göra med den.

Vi skriver följande kommando för att visa utdata i less:

uniq dust-my-broom.txt | less

Vi får ut hela låten, inklusive alla duplicerade rader:

Detta verkar varken ge oss unika rader eller markera dubbletter.

Detta är den första egenheten. Om du kör uniq utan tillval, beter det sig som om du använde tillvalet -u (unika rader). Detta talar om för uniq att endast skriva ut de rader som är unika i filen. Anledningen till att vi ser duplicerade rader är att för att uniq ska betrakta en rad som en dubblett, måste den ligga direkt efter sin dubblett. Det är här sort kommer in i bilden.

När vi sorterar filen, grupperas de dubblerade raderna och uniq behandlar dem som dubbletter. Vi kommer att använda sort på filen, skicka den sorterade utdatan till uniq och sedan visa den slutgiltiga utdatan i less.

För att göra detta skriver vi:

sort dust-my-broom.txt | uniq | less

En sorterad lista över unika rader visas nu i less.

Raden ”I believe I’ll dust my broom” förekommer flera gånger i låten. Faktum är att den upprepas två gånger inom låtens första fyra rader.

Så varför visas den i listan över unika rader? För att första gången en rad visas i filen, är den unik; endast de efterföljande förekomsterna är dubbletter. Du kan se det som att kommandot listar den första förekomsten av varje unik rad.

Låt oss använda sort igen och omdirigera utdatan till en ny fil. Då behöver vi inte använda sort i varje kommando.

Vi skriver följande:

sort dust-my-broom.txt > sorted.txt

Nu har vi en försorterad fil att arbeta med.

Räkna dubbletter

Du kan använda tillvalet -c (räkna) för att skriva ut antalet gånger varje rad förekommer i en fil.

Skriv följande:

uniq -c sorted.txt | less

Varje rad börjar med antalet gånger raden förekommer i filen. Du kommer att märka att den första raden är tom. Det betyder att det finns fem tomma rader i filen.

Om du vill sortera utdatan i numerisk ordning kan du skicka utdatan från uniq till sort. I vårt exempel kommer vi att använda tillvalen -r (omvänd) och -n (numerisk sortering) och visa resultatet i less.

Vi skriver:

uniq -c sorted.txt | sort -rn | less

Listan är nu sorterad i fallande ordning baserat på hur ofta varje rad förekommer.

Visa endast duplicerade rader

Om du bara vill se de rader som är duplicerade i en fil kan du använda tillvalet -d (duplicerad). Oavsett hur många gånger en rad dupliceras, visas den bara en gång.

För att använda detta tillval skriver vi:

uniq -d sorted.txt

De duplicerade raderna listas. Du kommer att märka den tomma raden högst upp, vilket betyder att filen innehåller duplicerade tomma rader – det är inte ett mellanrum lämnat av uniq som kompensation för listan.

Vi kan även kombinera tillvalen -d (duplicerad) och -c (räkna) och skicka utdatan genom sort. Detta ger oss en sorterad lista över de rader som förekommer minst två gånger.

Skriv följande för att använda detta:

uniq -d -c sorted.txt | sort -rn

Lista alla duplicerade rader

Om du vill se en lista över varje duplicerad rad, samt en post för varje gång raden förekommer i filen, kan du använda tillvalet -D (alla duplicerade rader).

För att använda det här tillvalet skriver du:

uniq -D sorted.txt | less

Listan innehåller en post för varje duplicerad rad.

Om du använder tillvalet --group skrivs varje duplicerad rad ut med en tom rad antingen före (prepend), efter (append), eller både före och efter (both) varje grupp.

Vi använder append som modifierare, så vi skriver:

uniq --group=append sorted.txt | less

Grupperna separeras av tomma rader för att göra dem enklare att läsa.

Kontrollera ett visst antal tecken

Som standard kontrollerar uniq hela längden på varje rad. Om du vill begränsa kontrollerna till ett visst antal tecken kan du använda tillvalet -w (kontrollera tecken).

I det här exemplet upprepar vi det sista kommandot, men begränsar jämförelserna till de tre första tecknen. För att göra det skriver vi följande:

uniq -w 3 --group=append sorted.txt | less

Resultaten och grupperingarna vi får är ganska olika.

Alla rader som börjar med ”I b” grupperas eftersom dessa delar av raderna är identiska och därför anses vara dubbletter.

På samma sätt behandlas alla rader som börjar med ”Jag är” som dubbletter, även om resten av texten skiljer sig åt.

Ignorera ett visst antal tecken

Det finns fall där det kan vara fördelaktigt att hoppa över ett visst antal tecken i början av varje rad, till exempel när raderna i en fil är numrerade. Eller om du vill att uniq ska hoppa över en tidsstämpel och börja kontrollera rader från tecken sex istället för från första tecknet.

Nedan visas en version av vår sorterade fil med numrerade rader.

Om vi vill att uniq ska starta sina jämförelsekontroller vid tecken tre kan vi använda tillvalet -s (hoppa över tecken) genom att skriva:

uniq -s 3 -d -c numbered.txt

Raderna identifieras som dubbletter och räknas korrekt. Observera att radnumren som visas är de för den första förekomsten av varje dubblett.

Du kan också hoppa över fält (en rad med tecken och lite blanksteg) istället för tecken. Vi använder tillvalet -f (fält) för att tala om för uniq vilka fält som ska ignoreras.

Vi skriver följande för att säga till uniq att ignorera det första fältet:

uniq -f 1 -d -c numbered.txt

Vi får samma resultat som när vi bad uniq att hoppa över tre tecken i början av varje rad.

Ignorera skiftläge

Som standard är uniq skiftlägeskänsligt. Om samma bokstav visas med versaler och gemener, betraktar uniq raderna som olika.

Kolla till exempel utdatan från följande kommando:

uniq -d -c sorted.txt | sort -rn

Raderna ”I Believe I’ll dust my broom” och ”I believe I’ll dust my broom” behandlas inte som dubbletter på grund av skillnaden i skiftläge på ”B” i ”Believe”.

Om vi inkluderar tillvalet -i (ignorera skiftläge) kommer dessa rader att behandlas som dubbletter. Vi skriver:

uniq -d -c -i sorted.txt | sort -rn

Raderna behandlas nu som dubbletter och grupperas.

Linux erbjuder en mängd specialverktyg. Liksom många av dem är uniq inte ett verktyg du kommer att använda varje dag.

Därför är en stor del av att bli skicklig i Linux att komma ihåg vilket verktyg som löser ditt aktuella problem, och var du kan hitta det igen. Om du övar kommer du dock att vara på god väg.

Eller så kan du alltid bara söka på How-To Geek – vi har förmodligen en artikel om det.