Jak používat příkaz uniq v systému Linux
Příkaz uniq pro Linux prochází vaše textové soubory a hledá jedinečné nebo duplicitní řádky. V této příručce se zabýváme její všestranností a funkcemi a také tím, jak můžete tuto šikovnou pomůcku využít na maximum.
Table of Contents
Hledání odpovídajících řádků textu v systému Linux
Příkaz uniq je rychlé, flexibilní a skvělé v tom, co dělá. Stejně jako mnoho příkazů Linuxu má však několik zvláštností – což je v pořádku, pokud o nich víte. Pokud se do toho pustíte bez sebemenšího zasvěceného know-how, můžete se klidně nechat poškrábat na hlavě nad výsledky. Na tyto zvláštnosti vám ukážeme za pochodu.
Příkaz uniq je perfektní pro ty, kteří jsou cílevědomí a jsou navrženi tak, aby dělali jednu věc a dělali to dobře. To je důvod, proč je také zvláště vhodný pro práci s rourami a hraje svou roli v příkazových rourách. Jeden z nich nejčastějšími spolupracovníky je sort, protože uniq musí mít seřazený vstup, na kterém může pracovat.
Pojďme to rozpálit!
Spuštění uniq bez možnosti
Máme textový soubor, který obsahuje texty k Roberta Johnsona píseň Věřím, že opráším své koště. Pojďme se podívat, co z toho dělá uniq.
Napíšeme následující, abychom výstup převedli do méně:
uniq dust-my-broom.txt | less
Získáme celou skladbu, včetně duplicitních řádků, za méně:
Nezdá se, že by to byly jedinečné řádky, ani duplicitní řádky.
Správně – protože tohle je první vtip. Pokud spustíte uniq bez voleb, chová se, jako byste použili volbu -u (unikátní řádky). To říká uniq, aby vytiskl pouze jedinečné řádky ze souboru. Důvod, proč vidíte duplicitní řádky, je ten, že má-li uniq považovat řádek za duplikát, musí sousedit s jeho duplikátem, což je místo řazení.
Když soubor třídíme, seskupuje duplicitní řádky a uniq s nimi zachází jako s duplikáty. Použijeme řazení na soubor, seřazený výstup převedeme do uniq a potom konečný výstup převedeme do méně.
Za tímto účelem zadáme následující:
sort dust-my-broom.txt | uniq | less
Seřazený seznam řádků se zobrazí méně.
Věta „Věřím, že opráším své koště“ se v písni určitě objeví víckrát. Ve skutečnosti se to opakuje dvakrát v prvních čtyřech řádcích písně.
Proč se tedy zobrazuje v seznamu jedinečných řádků? Protože když se v souboru poprvé objeví řádek, je jedinečný; pouze následující položky jsou duplikáty. Můžete si to představit jako výpis prvního výskytu každého jedinečného řádku.
Opět použijeme řazení a přesměrujeme výstup do nového souboru. Tímto způsobem nemusíme používat řazení v každém příkazu.
Zadáme následující příkaz:
sort dust-my-broom.txt > sorted.txt
sort.txt” v okně terminálu.‘ width=”646″ height=”57″ onload=”pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);” onerror=”this.onerror=null;pagespeed.lazyLoadImages.loadIfVisibleAndMaybeBeacon(this);”>
Nyní máme předřazený soubor, se kterým můžeme pracovat.
Počítání duplikátů
Pomocí volby -c (count) můžete vytisknout, kolikrát se každý řádek objeví v souboru.
Zadejte následující příkaz:
uniq -c sorted.txt | less
Každý řádek začíná počtem zobrazení daného řádku v souboru. Všimnete si však, že první řádek je prázdný. To vám říká, že v souboru je pět prázdných řádků.
Pokud chcete výstup seřadit v číselném pořadí, můžete výstup z uniq vložit do řazení. V našem příkladu použijeme volby -r (reverzní) a -n (numerické řazení) a výsledky převedeme do méně.
Zadáme následující:
uniq -c sorted.txt | sort -rn | less
Seznam je řazen sestupně na základě četnosti výskytu každého řádku.
Výpis pouze duplicitních řádků
Pokud chcete vidět pouze řádky, které se v souboru opakují, můžete použít volbu -d (opakované). Bez ohledu na to, kolikrát je řádek v souboru duplikován, je uveden pouze jednou.
Chcete-li použít tuto možnost, zadejte následující:
uniq -d sorted.txt
Duplicitní řádky jsou uvedeny pro nás. Nahoře si všimnete prázdného řádku, což znamená, že soubor obsahuje duplicitní prázdné řádky – není to místo, které uniq nechalo kosmeticky vyrovnat výpis.
Můžeme také zkombinovat volby -d (opakované) a -c (počet) a propojit výstup pomocí řazení. To nám dává seřazený seznam řádků, které se objevují alespoň dvakrát.
Chcete-li použít tuto možnost, zadejte následující:
uniq -d -c sorted.txt | sort -rn
Výpis všech duplicitních řádků
Pokud chcete vidět seznam všech duplicitních řádků a také záznam pro každé zobrazení řádku v souboru, můžete použít volbu -D (všechny duplicitní řádky).
Chcete-li použít tuto možnost, zadejte následující:
uniq -D sorted.txt | less
Výpis obsahuje záznam pro každý duplikovaný řádek.
Pokud použijete volbu –group, vytiskne každý duplikovaný řádek s prázdným řádkem buď před (prepend) nebo za každou skupinou (append), nebo před a za (obojí) každou skupinou.
Jako náš modifikátor používáme append, takže zadáme následující:
uniq --group=append sorted.txt | less
Skupiny jsou odděleny prázdnými řádky, aby byly lépe čitelné.
Kontrola určitého počtu znaků
Ve výchozím nastavení uniq kontroluje celou délku každého řádku. Pokud však chcete omezit kontroly na určitý počet znaků, můžete použít volbu -w (kontrolní znaky).
V tomto příkladu zopakujeme poslední příkaz, ale omezíme srovnání na první tři znaky. Chcete-li to provést, zadejte následující příkaz:
uniq -w 3 --group=append sorted.txt | less
Výsledky a seskupení, která dostáváme, jsou zcela odlišné.
Všechny řádky začínající na „I b“ jsou seskupeny, protože tyto části řádků jsou identické, takže jsou považovány za duplikáty.
Stejně tak všechny řádky začínající „já jsem“ jsou považovány za duplikáty, i když je zbytek textu odlišný.
Ignorování určitého počtu znaků
V některých případech může být užitečné přeskočit určitý počet znaků na začátku každého řádku, například když jsou řádky v souboru číslovány. Nebo řekněme, že potřebujete uniq, abyste přeskočili časové razítko a začali kontrolovat řádky od znaku šest místo od prvního znaku.
Níže je verze našeho tříděného souboru s očíslovanými řádky.
Pokud chceme, aby uniq začal své porovnávací kontroly na znaku tři, můžeme použít volbu -s (přeskočit znaky) zadáním následujícího:
uniq -s 3 -d -c numbered.txt
Čáry jsou detekovány jako duplikáty a správně počítány. Všimněte si, že zobrazená čísla řádků jsou čísla prvního výskytu každého duplikátu.
Místo znaků můžete také přeskočit pole (řadu znaků a nějaké mezery). Použijeme volbu -f (pole), abychom řekli uniq, která pole má ignorovat.
Zadáme následující, abychom řekli uniq, aby ignoroval první pole:
uniq -f 1 -d -c numbered.txt
Dostaneme stejné výsledky, jako když jsme řekli uniq, aby vynechal tři znaky na začátku každého řádku.
Ignorování případu
Ve výchozím nastavení uniq rozlišuje malá a velká písmena. Pokud se stejné písmeno zobrazí jako velké a malé, společnost uniq považuje řádky za odlišné.
Podívejte se například na výstup z následujícího příkazu:
uniq -d -c sorted.txt | sort -rn
Řádky „Věřím, že opráším své koště“ a „Věřím, že opráším své koště“ se nepovažují za duplikáty, protože se liší velikost písmen na „B“ v „věřím“.
Pokud však zahrneme volbu -i (ignorovat malá a velká písmena), tyto řádky budou považovány za duplikáty. Zadáme následující:
uniq -d -c -i sorted.txt | sort -rn
Řádky jsou nyní považovány za duplikáty a jsou seskupeny.
Linux vám dává k dispozici velké množství speciálních nástrojů. Jako mnoho z nich, ani uniq není nástroj, který budete používat každý den.
To je důvod, proč velkou součástí zvládnutí Linuxu je zapamatovat si, který nástroj vyřeší váš aktuální problém a kde jej můžete znovu najít. Pokud však budete cvičit, budete na dobré cestě.
Nebo můžete vždy jen hledat How-To Geek – pravděpodobně o tom máme článek.