Příkaz sort se používá v systémech Linux a Unix k uspořádání obsahu souboru v určitém pořadí. Pomocí příkazu sort uspořádáte řádky, abecedu a čísla v souboru.
Příkaz Sort má mnoho užitečných možností pro obrácení pořadí, číselné řazení souboru, řazení tabulky podle čísla sloupce, kontrolu, zda je soubor již seřazen, a odstranění duplikátů.
V tomto tutoriálu se naučíme o příkazu sort v Linuxu s několika praktickými příklady.
Příkaz řazení a jeho syntaxe
Následující řádek ukazuje syntaxi příkazu sort:
sort [options] [files]
Ve výchozím nastavení přebírá vstup ze STDIN, ale umí třídit soubory, když jsou názvy souborů uvedeny jako argument, a také umí třídit numericky.
Příkaz Sort lze vyvolat zadáním pouze sort
v terminálu. Poté vás vyzve k zadání vstupu ze STDIN. Po zadání STDIN stiskněte ctrl+d
se zadává pro označení konce vstupu.
Následující výstup ukazuje, že vstupní data ze STDIN jsou uspořádána v abecedním pořadí.
$ sort
cappa
beta
delta
theta
alpha
alpha
beta
cappa
delta
theta
Seřadit soubor
Ve výchozím nastavení řazení považuje všechny znaky za řetězcové znaky. Číselné znaky jsou rovněž považovány za znaky.
Nejprve vytvoříme soubor s číselnými daty, která se mají třídit. Následující příkaz vytvoří soubor 'numeric.txt' s numerickými daty:
$ cat > numeric.txt
01
10
25
83
502
111
Nyní seřaďme soubor 'numeric.txt' následovně:
$ sort numeric.txt
01
10
111
25
502
83
Výše uvedený výstup není to, co obecně očekáváme. Samozřejmě, 111 je větší než 25 a 502 je také větší než 83. Ale pokud vidíte zblízka, čísla jsou seřazeny ve slovníkovém pořadí.
Například pro 111 a 25 porovnejte první znak, 1 předchází 2. Proto je 111 umístěno před 25.
Pojďme se nyní podívat, jak se třídí, když jsou obsahem abecedy nebo slova. Následující soubor 'wordlist.txt' obsahuje slova začínající velkými a malými písmeny a zobrazuje seřazený seznam:
$ sort wordlist.txt Aeroplane ant apple bark born Box Cat tom
welcome
Možnosti řazení
Příkaz Sort přichází s docela dobrými možnostmi pro uspořádání obsahu souboru. Proberme některé z nich následovně:
řazení -n
:Chcete-li seřadit soubor podle čísel.
seřadit -u
:Potlačí řádky, které opakují předchozí klávesu.
seřadit -k
:Seřazení tabulky podle čísla sloupce.
řazení -t
SEP:K identifikaci polí použijte dodaný oddělovač.
řazení -M
:Seřadit podle zadaného kalendářního měsíce.
seřadit -b
:Ignorovat mezery na začátku řádku.
řazení -r
:Řazení v opačném pořadí.
řazení -o
:Výstup do nového souboru.
Třídit soubor číselně (volba -n)
Pokud chceme seřadit obsah uvnitř souboru číselně, použijeme -n
možnost.
V následujícím příkladu soubor 'numeric.txt' obsahuje čísla a data jsou řazena v číselném pořadí:
$ sort -n numeric.txt
01
10
25
83
111
502
Chcete-li obrátit číslo v souboru, použijte kombinaci -nr
možnost.
Například:
$ sort -nr numeric.txt
502
111
83
25
10
01
Seřadit a odstranit duplicitní řádky (volba -u)
Chcete-li seřadit a odstranit duplicitní řádky ze souboru, použijte -u
volba. První příkaz vypíše obsah souboru duplicate.txt pomocí příkazu cat a druhý použijeme -u
možnost odstranit duplicitní řádky.
Příklad:
$ cat duplicate.txt
hello
linux
lInux
Linux
raghu
world
zzz
zzz
Ukázkový výstup, kde můžete vidět, že duplicitní řádky jsou odstraněny v souboru 'duplicate.txt':
$ sort -u duplicate.txt
hello
linux
lInux
Linux
raghu
world
zzz
Řadit a ignorovat velikost písmen (volba -f)
Stejně jako mnoho jiných nástrojů pro Linux a Unix, příkaz sort ve výchozím nastavení rozlišuje malá a velká písmena. Ale pokud potřebujeme ignorovat velká a malá písmena, můžeme použít -f
nebo --ignore-case
možnost.
Například v 'duplicate.txt' jsou tři výskyty slova 'linux' v různých případech. Ve výchozím nastavení jsou všechny vytištěny s -u
volba. Znamená to, že nejsou jedinečné pro příkaz řazení.
Ale pokud použijeme -f
volba by byla ignorována, jak je uvedeno níže:
$ sort -f -u duplicate.txt
hello
linux
raghu
world
zzz
Řadit podle sloupce (volba -k)
Příkaz sort může třídit libovolnou tabulku podle čísla sloupce pomocí -k
volba. Například použijte '-k3' k řazení třetího sloupce v tabulce.
Uvažujme, že máme obsah v souboru 'population.txt' takto:
$ cat population.txt
Kids 500 India
Youth 400 England
Senior 600 USA
Junior 9000 Australia
Pensioners 650 China
V následujícím seřadíme tabulku podle sloupce číslo 2 v souboru populace.txt:
$ sort -k2 population.txt
Youth 400 England
Kids 500 India
Senior 600 USA
Pensioners 650 China
Junior 9000 Australia
Seřadit více sloupců
V některých situacích může být nutné seřadit tabulku pomocí více sloupců. Vezměme si příklad souboru obsahujícího více sloupců dat.
Následující soubor 'columns.txt' obsahuje několik sloupců, jak je uvedeno:
cat columns.txt
version1.2 10 25
version1.2 30 50
version1.1 10 30
version1.1 40 50
version1.2 40 50
version1.1 10 20
version1.1 5 8
Nyní zaškrtněte příkaz k řazení sloupců 1, 2 a 3 v číselném pořadí.
$ sort -k1,1 -k2,2n -k3,3n columns.txt
version1.1 5 8
version1.1 10 20
version1.1 10 30
version1.1 40 50
version1.2 10 25
version1.2 30 50
version1.2 40 50
Řadit podle oddělovače pole sloupce (možnost oddělovače -t)
Ve výchozím nastavení je oddělovač sloupců mezera nebo tabulátor. Můžeme však použít vlastní oddělovač pomocí -t
nebo --field-separator
možnost v řazení.
Vezměme si příklad, použijte dvojtečku (:) jako oddělovač a soubor '/etc/passwd' k řazení.
Pokud chceme seřadit soubor /etc/passwd na základě UID, použijeme následující příkaz:
$ sort -n -t ':' -k3 /etc/passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
news:x:9:13:news:/etc/news:
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
operator:x:11:0:operator:/root:/sbin/nologin
games:x:12:100:games:/usr/games:/sbin/nologin
<---output truncated--->
Řadit podle měsíce (možnost -M)
Pomocí -M
možnost, kterou můžete seřadit podle měsíce. Pokud máte soubor s měsíci, seřaďte pořadí příkazů podle měsíců.
Například soubor 'months.txt' obsahuje seznam názvů měsíců.
$ cat months.txt
sep
august
july
dec
feb
may
jan
Nyní použijeme volbu -M k seřazení souboru 'months.txt' podle měsíce.
$ sort -M months.txt
jan
feb
may
july
august
sep
dec
Třídit pro člověka čitelná čísla (možnost -h)
Řazení může seřadit pro člověka čitelná čísla, jako je 2K, 5G, 3M, pomocí -h nebo --human-numeric-sort
možnost.
Například níže uvedené číslo seznamu souborů
$ cat human_numeric.txt
4G
2K
3M
1G
34K
52M
200M
Následující příkaz použijte -h
možnost porovnávat a třídit člověkem čitelná čísla.
$ sort -h human_numeric.txt
2K
34K
3M
52M
200M
1G
4G
Zkontrolujte seřazený vstup (volba -c)
Příkaz sort může pomocí -c
zkontrolovat, zda je vstup již setříděn nebo ne volba. Pokud není seřazený, vrátí první neseřazený řádek.
$ sort -c /etc/passwd
sort: /etc/passwd:2: disorder: daemon:x:1:1:daemon:/usr/sbin:/bin/sh
Pro seřazený vstup se nic nevytiskne:
$ sort /etc/passwd | sort -c
$ echo $?
0
Řadit pomocí jiných příkazů
Řazení je nástroj pro zpracování textu, takže jej lze použít pomocí propojení vstupů z jiného příkazu.
V následujícím příkazu používáme výstup příkazu tail jako vstup pro třídění:
$ tail /etc/passwd | sort
altair:x:1001:1001:Altair Ibn La Ahad,,,,:/home/altair:/bin/bash
bind:x:120:132::/var/cache/bind:/bin/false
dnsmasq:x:121:65534:dnsmasq,,,:/var/lib/misc:/bin/false
mysql:x:115:129:MySQL Server,,,:/nonexistent:/bin/false
postfix:x:105:126::/var/spool/postfix:/bin/false
raghu:x:1000:1000:raghu,,,:/home/raghu:/bin/bash
smmsp:x:119:131:Mail Submission Program,,,:/var/lib/sendmail:/bin/false
smmta:x:118:130:Mail Transfer Agent,,,:/var/lib/sendmail:/bin/false
sshd:x:117:65534::/var/run/sshd:/usr/sbin/nologin
statd:x:116:65534::/var/lib/nfs:/bin/false
Řazení lze obrátit pomocí volby -r.
Vezměme si další příklad pro třídění výstupu příkazu du ve formátu čitelném pro člověka podle velikosti, použijte následující příkaz:
$ du -h | sort -h
Závěr
V tomto tutoriálu se seznámíme s řazením v systému Linux a jeho možností objednat obsah souborů. Doufám, že se vám čtení líbilo, a pokud najdete nějaké další příklady, komentujte níže.