<Poprzedni | Spis treści | Następne>
rodzaj
Kurs rodzaj program sortuje zawartość standardowego wejścia lub jednego lub więcej plików określonych w wierszu poleceń i wysyła wyniki na standardowe wyjście. Używając tej samej techniki, której używaliśmy jak, możemy zademonstrować przetwarzanie standardowego wejścia bezpośrednio z klawiatury:
[ja@linuxbox ~]$ sortuj > foo.txt
cba
[ja@linuxbox ~]$ kot foo.txt
ABC
[ja@linuxbox ~]$ sortuj > foo.txt
cba
[ja@linuxbox ~]$ kot foo.txt
ABC
Po wpisaniu polecenia wpisujemy litery „c”, „b” i „a”, a następnie jeszcze raz Ctrl+d aby wskazać koniec pliku. Następnie przeglądamy wynikowy plik i widzimy, że linie pojawiają się teraz w posortowanej kolejności.
Ponieważ rodzaj może akceptować wiele plików w wierszu poleceń jako argumenty, jest to możliwe łączyć wiele plików w jedną posortowaną całość. Na przykład, gdybyśmy mieli trzy pliki tekstowe i chcieli połączyć je w jeden posortowany plik, moglibyśmy zrobić coś takiego:
sortuj plik1.txt plik2.txt plik3.txt > final_sorted_list.txt
sortuj plik1.txt plik2.txt plik3.txt > final_sorted_list.txt
sort ma kilka interesujących opcji. Oto częściowa lista:
Tabela 20-1: Wspólne opcje sortowania
Option | Długa opcja | Opis |
-b | --ignore-wiodące-puste | Domyślnie sortowanie jest włączone |
całą linię, zaczynając od | ||
pierwszy znak w linii. Ten | ||
opcja powoduje ignorowanie sortowania | ||
spacje wiodące w liniach i | ||
oblicza sortowanie na podstawie pierwszego | ||
znak inny niż biały znak na | ||
Linia. | ||
-f | --ignoruj-przypadek | Sprawia, że sortowanie nie uwzględnia wielkości liter. |
-n | --sortowanie numeryczne | Wykonuje sortowanie na podstawie numerycznej oceny ciągu. Użycie tej opcji umożliwia sortowanie według wartości numerycznych, a nie alfabetycznych. |
-r | --odwrócić | Sortuj w odwrotnej kolejności. Wyniki są |
opadający, a nie rosnący | ||
zamówienie. | ||
-k | --klucz=pole1[,pole2] | Sortuj w oparciu o zlokalizowane pole kluczowe |
od pole1 do pole2 a nie | ||
cała linia. Zobacz dyskusję poniżej. | ||
-m | --łączyć | Traktuj każdy argument jako nazwę |
wstępnie posortowanego pliku. Połącz wiele | ||
pliki w jeden posortowany wynik | ||
bez wykonywania dodatkowych czynności | ||
sortowanie. | ||
-o | --wyjście=filet | Wyślij posortowane dane wyjściowe do filet raczej |
niż standardowe wyjście. | ||
-t | --separator-pól=zwęglać | Zdefiniuj separator pól |
postać. Domyślnie pola są | ||
oddzielone spacjami lub tabulatorami. |
Chociaż większość powyższych opcji jest dość oczywista, niektóre nie. Najpierw przyjrzyjmy się -n opcja używana do sortowania numerycznego. Dzięki tej opcji możliwe jest sortowanie wartości na podstawie wartości numerycznych. Możemy to zademonstrować, sortując wyniki funkcji du polecenie w celu określenia największych użytkowników miejsca na dysku. Zwykle du polecenie wyświetla wyniki podsumowania w kolejności nazw ścieżek:
[ja@linuxbox ~]$ du -s /usr/share/* | głowa
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
[ja@linuxbox ~]$ du -s /usr/share/* | głowa
252 /usr/share/aclocal
96 /usr/share/acpi-support
8 /usr/share/adduser
196 /usr/share/alacarte
344 /usr/share/alsa
8 /usr/share/alsa-base 12488 /usr/share/anthy
8 /usr/share/apmd
21440 /usr/share/app-install
48 /usr/share/application-registry
W tym przykładzie potokujemy wyniki do głowa aby ograniczyć wyniki do pierwszych dziesięciu linii. Możemy stworzyć posortowaną numerycznie listę dziesięciu największych konsumentów przestrzeni w ten sposób:
[ja@linuxbox ~]$ du -s /usr/share/* | sortuj -nr | głowa
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dykt
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
[ja@linuxbox ~]$ du -s /usr/share/* | sortuj -nr | głowa
509940 /usr/share/locale-langpack
242660 /usr/share/doc
197560 /usr/share/fonts
179144 /usr/share/gnome
146764 /usr/share/myspell
144304 /usr/share/gimp
135880 /usr/share/dykt
76508 /usr/share/icons
68072 /usr/share/apps
62844 /usr/share/foomatic
Przy użyciu -nr opcji, tworzymy odwrotne sortowanie numeryczne, w którym największe wartości pojawiają się jako pierwsze w wynikach. Sortowanie to działa, ponieważ wartości liczbowe występują na początku każdego wiersza. Ale co, jeśli chcemy posortować listę na podstawie wartości znalezionej w wierszu? Na przykład wyniki ls -l:
[ja@linuxbox ~]$ ls -l /usr/bin | głowa
Razem 152948
-rwxr-xr-x | 1 | korzeń | korzeń | 34824 | 2016-04-04 | 02:42 | [ |
-rwxr-xr-x | 1 | korzeń | korzeń | 101556 | 2007-11-27 | 06:08 | 2p |
-rwxr-xr-x | 1 | korzeń | korzeń | 13036 | 2016-02-27 | 08:22 | połączyć |
-rwxr-xr-x | 1 | korzeń | korzeń | 10552 | 2007-08-15 | 10:34 | ACPI |
-rwxr-xr-x | 1 | korzeń | korzeń | 3800 | 2016-04-14 | 03:51 | acpi_fakekey |
-rwxr-xr-x | 1 | korzeń | korzeń | 7536 | 2016-04-19 | 00:19 | acpi_słuchaj |
-rwxr-xr-x | 1 | korzeń | korzeń | 3576 | 2016-04-29 | 07:57 | dodatek |
-rwxr-xr-x | 1 | korzeń | korzeń | 20808 | 2016-01-03 | 18:02 | adres2linia |
-rwxr-xr-x | 1 | korzeń | korzeń | 489704 | 2016-10-09 | 17:02 | adept_batch |
Ignorując to na razie ls może posortować wyniki według rozmiaru, moglibyśmy to wykorzystać rodzaj aby posortować tę listę również według rozmiaru pliku:
[ja@linuxbox ~]$ ls -l /usr/bin | sortuj -nr -k 5 | głowa
-rwxr-xr-x | 1 | korzeń | korzeń | 8234216 | 2016-04-07 | 17:42 | inkscape |
-rwxr-xr-x | 1 | korzeń | korzeń | 8222692 | 2016-04-07 | 17:42 | kałamarz |
-rwxr-xr-x | 1 | korzeń | korzeń | 3746508 | 2016-03-07 | 23:45 | gimp-2.4 |
-rwxr-xr-x | 1 | korzeń | korzeń | 3654020 | 2016-08-26 | 16:16 | kwanty |
-rwxr-xr-x | 1 | korzeń | korzeń | 2928760 | 2016-09-10 | 14:31 | gdbtui |
-rwxr-xr-x | 1 | korzeń | korzeń | 2928756 | 2016-09-10 | 14:31 | gdb |
-rwxr-xr-x | 1 | korzeń | korzeń | 2602236 | 2016-10-10 | 12:56 | netto |
-rwxr-xr-x | 1 | korzeń | korzeń | 2304684 | 2016-10-10 | 12:56 | klient klienta |
-rwxr-xr-x | 1 | korzeń | korzeń | 2241832 | 2016-04-04 | 05:56 | uzdolnienie |
-rwxr-xr-x | 1 | korzeń | korzeń | 2202476 | 2016-10-10 | 12:56 | smbcacls |
Wiele zastosowań rodzaj obejmować przetwarzanie dane tabelaryczne, takie jak wyniki ls polecenie powyżej. Jeśli zastosujemy terminologię dotyczącą baz danych do powyższej tabeli, powiedzielibyśmy, że każdy wiersz to a rekord i że każdy rekord składa się z wielu Pola, takie jak atrybuty pliku, liczba łączy, nazwa pliku, rozmiar pliku i tak dalej. rodzaj jest w stanie przetwarzać poszczególne pola. W kategoriach baz danych jesteśmy w stanie określić jeden lub więcej kluczowe pola używać jako klucze sortowania. W powyższym przykładzie określamy n i r opcje umożliwiające odwrotne sortowanie numeryczne i określanie -k 5 aby rodzaj użyj piątego pola jako klucza do sortowania.
Kurs k opcja jest bardzo interesująca i ma wiele funkcji, ale najpierw musimy porozmawiać o tym, jak to zrobić rodzaj definiuje pola. Rozważmy bardzo prosty plik tekstowy składający się z pojedynczej linii zawierającej nazwisko autora:
Williama Shottsa
Williama Shottsa
Domyślnie rodzaj widzi tę linię jako mającą dwa pola. Pierwsze pole zawiera znaki:
„William”
a drugie pole zawiera znaki:
„Strzały”
co oznacza, że białe znaki (spacje i tabulatory) są używane jako ograniczniki między polami i że ograniczniki są uwzględniane w polu podczas sortowania.
Patrząc ponownie na linię z naszego ls na wyjściu widzimy, że linia zawiera osiem pól, a piąte pole to rozmiar pliku:
-rwxr-xr-x 1 korzeń korzeń 8234216 2016-04-07 17:42 inkscape
-rwxr-xr-x 1 korzeń korzeń 8234216 2016-04-07 17:42 inkscape
Do naszej następnej serii eksperymentów rozważmy następujący plik zawierający historię trzech popularnych dystrybucji Linuksa wydanych w latach 2006-2008. Każda linia w pliku ma trzy pola: nazwę dystrybucji, numer wersji i datę wydania w MM/DD /YYYY w formacie:
SUSE | 10.2 | 12/07/2006 |
Fedora | 10 | 11/25/2008 |
SUSE | 11.0 | 06/19/2008 |
Ubuntu | 8.04 | 04/24/2008 |
Fedora | 8 | 11/08/2007 |
SUSE | 10.3 | 10/04/2007 |
Ubuntu | 6.10 | 10/26/2006 |
Fedora | 7 | 05/31/2007 |
Ubuntu | 7.10 | 10/18/2007 |
Ubuntu | 7.04 | 04/19/2007 |
SUSE | 10.1 | 05/11/2006 |
Fedora | 6 | 10/24/2006 |
Fedora | 9 | 05/13/2008 |
Ubuntu | 6.06 | 06/01/2006 |
Ubuntu | 8.10 | 10/30/2008 |
Fedora | 5 | 03/20/2006 |
Używając edytora tekstu (być może vim), wprowadzimy te dane i nazwiemy powstały plik distros.txt.
Następnie spróbujemy posortować plik i obserwować wyniki:
[ja@linuxbox | ~]$ | sortuj dystrybucje.txt |
Fedora 10 | 11/25/2008 | |
Fedora 5 | 03/20/2006 | |
Fedora 6 | 10/24/2006 | |
Fedora 7 | 05/31/2007 | |
Fedora 8 | 11/08/2007 | |
Fedora 9 | 05/13/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
Ubuntu 6.06 | 06/01/2006 | |
Ubuntu 6.10 | 10/26/2006 | |
Ubuntu 7.04 | 04/19/2007 | |
Ubuntu 7.10 | 10/18/2007 | |
Ubuntu 8.04 | 04/24/2008 | |
Ubuntu 8.10 | 10/30/2008 |
Cóż, w większości działało. Problem występuje podczas sortowania numerów wersji Fedory. Ponieważ „1” występuje przed „5” w zestawie znaków, wersja „10” kończy się na górze, a wersja „9” spada na dół.
Aby rozwiązać ten problem, będziemy musieli sortować według wielu kluczy. Chcemy wykonać sortowanie alfabetyczne w pierwszym polu, a następnie sortowanie numeryczne w drugim polu. rodzaj pozwala
wiele przypadków -k opcję, dzięki czemu można określić wiele kluczy sortowania. W rzeczywistości klucz może zawierać szereg pól. Jeśli nie określono żadnego zakresu (jak to miało miejsce w naszych poprzednich przykładach), rodzaj używa klucza rozpoczynającego się od określonego pola i kończącego się na końcu linii. Oto składnia naszego sortowania wielokluczowego:
[ja@linuxbox | ~]$ | sort --key=1,1 --key=2n dystrybucje.txt |
Fedora 5 | 03/20/2006 | |
Fedora 6 | 10/24/2006 | |
Fedora 7 | 05/31/2007 | |
Fedora 8 | 11/08/2007 | |
Fedora 9 | 05/13/2008 | |
Fedora 10 | 11/25/2008 | |
SUSE 10.1 | 05/11/2006 | |
SUSE 10.2 | 12/07/2006 | |
SUSE 10.3 | 10/04/2007 | |
SUSE 11.0 | 06/19/2008 | |
Ubuntu 6.06 | 06/01/2006 | |
Ubuntu 6.10 | 10/26/2006 | |
Ubuntu 7.04 | 04/19/2007 | |
Ubuntu 7.10 | 10/18/2007 | |
Ubuntu 8.04 | 04/24/2008 | |
Ubuntu 8.10 | 10/30/2008 |
Chociaż dla przejrzystości użyliśmy długiej formy opcji, -k 1,1 -k 2n byłoby dokładnie równoważne. W pierwszej instancji opcji klucza określiliśmy zakres pól, które mają zostać uwzględnione w pierwszym kluczu. Ponieważ chcieliśmy ograniczyć sortowanie tylko do pierwszego pola, określiliśmy 1,1 co oznacza „zacznij od pierwszego pola i zakończ na pierwszym polu”. W drugim przypadku określiliśmy 2n, co oznacza, że pole 2 jest kluczem sortowania i sortowanie powinno być numeryczne. Na końcu specyfikatora klucza można umieścić literę opcji, aby wskazać typ sortowania, który ma zostać wykonany. Te litery opcji są takie same, jak opcje globalne dla rodzaj program: b (zignoruj początkowe spacje), n (sortowanie numeryczne), r (sortowanie odwrotne) i tak dalej.
Trzecie pole na naszym zestawieniu zawiera datę w formacie niewygodnym do sortowania. Na komputerach daty są zwykle formatowane w kolejności RRRR-MM-DD, aby ułatwić sortowanie chronologiczne, ale w naszym przypadku daty są w amerykańskim formacie MM/DD/RRRR. Jak posortować tę listę w porządku chronologicznym?
Na szczęście, rodzaj zapewnia sposób. Opcja klucza umożliwia określenie przesunięcia wewnątrz pól, dzięki czemu możemy zdefiniować klucze w obrębie pól:
[ja@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
Fedora 10 11
Ubuntu 8.10 10
[ja@linuxbox ~]$ sort -k 3.7nbr -k 3.1nbr -k 3.4nbr distros.txt
Fedora 10 11
Ubuntu 8.10 10
SUSE | 11.0 | 06/19/2008 |
Fedora | 9 | 05/13/2008 |
Ubuntu | 8.04 | 04/24/2008 |
Fedora | 8 | 11/08/2007 |
Ubuntu | 7.10 | 10/18/2007 |
SUSE | 10.3 | 10/04/2007 |
Fedora | 7 | 05/31/2007 |
Ubuntu | 7.04 | 04/19/2007 |
SUSE | 10.2 | 12/07/2006 |
Ubuntu | 6.10 | 10/26/2006 |
Fedora | 6 | 10/24/2006 |
Ubuntu | 6.06 | 06/01/2006 |
SUSE | 10.1 | 05/11/2006 |
Fedora | 5 | 03/20/2006 |
Określając -k 3.7 instruujemy rodzaj użyć klucza sortowania rozpoczynającego się od siódmego znaku w trzecim polu, który odpowiada początkowi roku. Podobnie określamy -k 3.1 i -k 3.4 aby odizolować część daty zawierającą miesiąc i dzień. Dodajemy także n i r opcje umożliwiające odwrotne sortowanie numeryczne. The b dostępna jest opcja pomijania wiodących spacji (których numery różnią się w zależności od wiersza, wpływając w ten sposób na wynik sortowania) w polu daty.
W niektórych plikach nie używa się tabulatorów ani spacji jako ograniczników pól; na przykład / Etc / passwd
file:
[ja@linuxbox ~]$ głowa /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
[ja@linuxbox ~]$ głowa /etc/passwd root:x:0:0:root:/root:/bin/bash daemon:x:1:1:daemon:/usr/sbin:/bin/sh bin:x:2:2:bin:/bin:/bin/sh sys:x:3:3:sys:/dev:/bin/sh sync:x:4:65534:sync:/bin:/bin/sync games:x:5:60:games:/usr/games:/bin/sh man:x:6:12:man:/var/cache/man:/bin/sh lp:x:7:7:lp:/var/spool/lpd:/bin/sh mail:x:8:8:mail:/var/mail:/bin/sh news:x:9:9:news:/var/spool/news:/bin/sh
Pola w tym pliku są oddzielone dwukropkami (:), więc jak posortować ten plik za pomocą pola klucza? rodzaj zapewnia -t możliwość zdefiniowania znaku oddzielającego pola. Aby posortować passwd plik w siódmym polu (domyślna powłoka konta), moglibyśmy to zrobić:
[ja@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | głowa
ja:x:1001:1001:Ja,,,:/home/me:/bin/bash
[ja@linuxbox ~]$ sort -t ':' -k 7 /etc/passwd | głowa
ja:x:1001:1001:Ja,,,:/home/me:/bin/bash
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:Użytkownik systemu HPLIP,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false Messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false impuls:x:107:116:Demon PulseAudio,,,:/var/run/pulse:/bin/false
root:x:0:0:root:/root:/bin/bash dhcp:x:101:102::/nonexistent:/bin/false
gdm:x:106:114:Gnome Display Manager:/var/lib/gdm:/bin/false hplip:x:104:7:Użytkownik systemu HPLIP,,,:/var/run/hplip:/bin/false klog :x:103:104::/home/klog:/bin/false Messagebus:x:108:119::/var/run/dbus:/bin/false polkituser:x:110:122:PolicyKit,,,: /var/run/PolicyKit:/bin/false impuls:x:107:116:Demon PulseAudio,,,:/var/run/pulse:/bin/false
Określając znak dwukropka jako separator pól, możemy sortować według siódmego pola.