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.