GNU/Linux >> Znalost Linux >  >> Linux

Uniq Command v Linuxu vysvětleno s příklady

Naučte se pomocí těchto praktických příkladů používat příkaz uniq v Unixu a Linuxu.

Příkaz uniq v Unixu a Linuxu se používá pro filtrování duplicitního textu. Může být použit samostatně, ale běžně se používá spolu s dalšími příkazy, jako je identifikace nadbytečných informací v souboru.

Zde je syntaxe příkazu uniq:

uniq [options] <input-file> <output-file>

Když spustíte uniq bez voleb, použije stdin a stdout pro vstup a výstup.

I když je použití stdin možné pomocí schránky (kopírovat/vložit), není to nejpraktičtější použití.

Místo toho byste pravděpodobně chtěli použít tento příkaz u souboru, o kterém se domníváte, že obsahuje duplicitní informace.

Jedno omezení příkazu uniq spočívá v tom, že identifikuje pouze duplikáty, které v souboru sousedí nebo jsou vedle sebe. To je docela jednoduché, ale dovolte mi to ukázat na příkladu, abyste to viděli v akci.

[[email protected] ~]$ cat apple.txt
apple
apple
orange
orange
apple 
orange
[[email protected] ~]$ uniq apple.txt 
apple
orange
apple 
orange

Takže hned víte, že nemůžete důvěřovat programu, že každý duplikát identifikuje sám. Existuje několik způsobů, jak to obejít, a obvykle je to pomocí příkazu sort.

Ukážu vám to později v tomto článku. Nejprve mi dovolte projít si několik příkladů, abyste se seznámili s „uniq“, než zamíchám další příkazy a potenciálně matoucí věci.

7 příkladů příkazu uniq v Linuxu

Použil jsem skutečný systémový protokol, ale upravil jsem jej pro demonstrační účely. Většina souboru již byla roztříděna do sousedního pořadí, ale nechal jsem několik řádků „nemístných“, abych ukázal funkčnost příkazu uniq.

https://gist.github.com/abhishekpc/7dada8c6e57fd5b854f9d2dae72dddb0STÁHNOUT UKÁZKOVÝ TEXTOVÝ SOUBOR

Příklad 1:Použití příkazu uniq jako výchozí způsob

Ačkoli jsem vám to již ukázal, podívejme se na náš ukázkový soubor s výchozí syntaxí.

[[email protected] ~]$ uniq sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Můžete vidět, že mnoho duplicitních řádků je konsolidováno, ale stále obsahuje nadbytečné informace. To je způsobeno funkčním omezením, které jsem již popsal. Podívejme se na několik dalších příkladů a prozkoumáme některé možnosti, které jsou integrovány do nástroje příkazového řádku „uniq“.

Příklad 2:Výstup filtrovaných výsledků do cílového souboru

Možná budete chtít uložit tento výstup, abyste jej mohli snadno upravit nebo zachovat. Náš výstup můžete přesměrovat do samostatného souboru namísto normálního stdout (terminálu). Je důležité si uvědomit, že tento formát nelze použít k přepsání původního souboru.

[[email protected] ~]$ uniq sample_log_file.txt uniq_log_output.txt 

Zde je obsah výstupního souboru:

[[email protected] ~]$ cat uniq_log_output.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Příklad 3:Použití „-c“ k získání počtu opakovaných řádků

Tato možnost je docela samozřejmá. Program připojí počet na začátek každého řádku.

[[email protected] ~]$ uniq sample_log_file.txt -c
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
      2 /usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
      5 /usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
      1 /usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
      7 /usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
      1 PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
      8 wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Příklad 4:Tisk opakujících se řádků pouze s „-d“

Jak vidíte, zobrazí se pouze řádky, které jsou v souboru duplikovány, pokud použijete volbu -d příkazu uniq.

[[email protected] ~]$ uniq sample_log_file.txt -d
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device is a keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: is tagged by udev as: Keyboard
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
/usr/lib/gdm3/gdm-x-session[1443]: (II) This device may have been added with another device file.
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Příklad 5:Tisk jedinečných řádků pouze s „-u“

Zde získáte inverzní výstup předchozího příkazu. Žádný z těchto příkazů se v souboru neopakuje.

[[email protected] ~]$ uniq sample_log_file.txt -u
/usr/lib/gdm3/gdm-x-session[1443]: (II) event9  - Intel HID events: device removed
/usr/lib/gdm3/gdm-x-session[1443]: (II) systemd-logind: got fd for /dev/input/event10 13:74 fd 55 paused 0
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms

Příklad 6:Ignorování polí nebo znaků s uniq ['-f' a '-s']

Toto jsou skutečně dva příklady, ale funkce jsou téměř totožné. Vysvětlím, jak fungují, a poté objasním rozdíly mezi nimi.

Každý z nich používá následující syntaxi

Skip fields with:
uniq <source_file> -f N
Skip characters with:
uniq <source_file> -s N

V každém z těchto příkladů je „N“ počet položek, které chcete přeskočit. Když tento počet položek přeskočíte, společnost uniq zahájí srovnání v tomto bodě a nebude porovnávat celý řádek.

Možnost „f“ přeskočí přidělený počet polí. Pole budou interpretována pomocí prázdného místa.

[[email protected] ~]$ cat field_separated_values.txt 
blue fish
blue fish
blue fish
blue class
red fish
green fish
two class
two class

Pokud chcete použít příkaz uniq ve druhém sloupci, budete muset přeskočit první pole takto:

[[email protected] ~]$ uniq -f1 field_separated_values.txt  
blue fish
blue class
red fish
two class

Jak můžete vidět, bere „červenou rybu“ i „zelenou rybu“ jako stejný řádek, protože první pole (s barvami) bylo ignorováno. Pokud zde použijete možnost počet, zobrazí se vám počet jedinečných řádků, které našel:

[[email protected] ~]$ uniq -f1 -c field_separated_values.txt  
      3 blue fish
      1 blue class
      2 red fish
      2 two class

Proč bys to potřeboval? Dám vám praktický scénář. Mnoho souborů protokolu má na začátku řádků časové razítko. Pokud chcete v takovém souboru najít pouze jedinečné řádky, můžete přeskočit první pole s časovým razítkem s volbou -f.

Podobně můžete přeskočit určitý počet znaků.

[[email protected] ~]$ uniq -s 10 field_separated_values.txt 
blue    fish

Příklad 7:Použijte „-w“ k porovnání pouze N znaků

Volba „-w“ nám umožňuje zadat přesný počet znaků, které se mají použít v našem srovnání.

Pokud jste použili soubor protokolu pro předchozích pár příkladů, je to v pořádku. Chtěl jsem srovnávací text trochu zjednodušit, abych omezil zmatek. Pokud ne, pojďme to vytáhnout zpět a uvidíme, co se stane, když k nalezení duplikátů použijete pouze první znak.

[[email protected] ~]$ uniq -w 4 sample_log_file.txt 
/usr/lib/gdm3/gdm-x-session[1443]: (II) No input driver specified, ignoring this device.
PackageKit: get-updates transaction /354_eebeebaa from uid 1000 finished with success after 1514ms
wpa_supplicant[898]: RRM: Ignoring radio measurement request: Not RRM network

Všechny řádky, které začínají „/usr“, jsou nyní z pohledu programu označeny jako „stejné“.

To může být užitečné, pokud hledáte konkrétní událost protokolu.

Bonus:Vyhněte se neúplným shodám pomocí 'sort' a 'uniq' současně.

Tyto příkazy můžete spouštět samostatně, abyste dosáhli stejného efektu, ale pokud jste v Linuxu nikdy nepoužili rouru (znak |), je to skvělý způsob, jak se o nich dozvědět.

Pomocí kanálů můžete kombinovat různé příkazy, abyste nám ušetřili stisknutí kláves a zlepšili náš pracovní postup. Příkazy budou provedeny v pořadí, v jakém jsou napsány.

Toto je ukázkový vstup, který použiji:

[[email protected] ~]$ cat apple.txt 
apple
orange
orange
apple
apple
banana
apple
banana

Nyní seřaďte vstupní soubor a poté na něj použijte příkaz uniq. Příkaz řazení přeuspořádá text tak, aby byly všechny položky nejprve v sousedním pořadí. Poté, když je příkaz uniq spuštěn, najde v souboru pouze 3 jedinečné řádky.

[[email protected] ~]$ sort apple.txt | uniq 
apple
banana
orange

Pokud obrátíte pořadí, věci se změní. Provedením příkazu „uniq“ nejprve identifikujete pouze sousední duplikáty a poté je každý seřadíte v abecedním pořadí pomocí příkazu „sort“.

[[email protected] ~]$ uniq apple.txt | sort
apple
apple
apple
banana
banana
orange

Pipe nám umožňují spouštět více příkazů současně, ale je důležité zvážit jejich pořadí.

Všimněte si, že obsah souboru zůstává nezměněn, stejně jako při spouštění příkazů jednotlivě. Propojení dvou příkazů dohromady také uchová výsledky v „paměti“ systému. Pokud jste je spouštěli samostatně, nemohli byste získat tyto výsledky, pokud jste nevytvořili nový soubor a nepoužili jej k přepsání obsahu původního před spuštěním druhého příkazu.

Závěr

Jak si dokážete představit, díky tomu je to důležitý koncept při učení bash. Tyto konkrétní příkazy (sort a uniq) se často používají společně pro rychlé filtrování informací z velkých souborů, jako je náš pseudo-log.


Linux
  1. Příkaz vypnutí Linuxu s příklady

  2. Příkaz nslookup Linux vysvětlený s příklady

  3. Příkaz Linux Traceroute, vysvětlený s příklady

  1. Linux cut Command Vysvětlení pomocí 6 příkladů

  2. Příkaz whoami v Linuxu vysvětlený na příkladech

  3. Linuxový příkaz Ping vysvětlený s příklady

  1. Příkaz Linux ldd vysvětlený s příklady

  2. Linux dělá příkaz vysvětlený s příklady

  3. Linux Cut Command s praktickými příklady