Linux-kommandoer

Bash sorteringskommando

Bash sorteringskommando
Held og lykke med at prøve at implementere en sorteringsalgoritme i bash end færdig før i morgen. Ingen bekymringer, det behøver du ikke, fordi du har sorteringskommandoen.

Med sortering kan du bestille filer baseret på rækkefølgen i ordbogen eller ved numerisk værdi, randomisere fillinjer, fjerne duplikatlinjer og kontrollere, om en fil er sorteret.

Du kan muligvis gøre andre ting med det, men lad os først bekymre os om at pakke vores hoveder omkring, hvordan man bruger sortering i bash-scripts.

Hvad er sortering??

Sort er en ekstern kommando, der sammenkæder filer, mens de sorterer deres indhold efter en sorteringstype og skriver resultater af sortering til standardoutput.

Sorter kommandomuligheder til bash

Sorteringskommandoen kommer med 31 muligheder (13 hoved og 18 kategoriseret som andre). Mest erfarne bash-programmering (endda eksperter) kender kun et par hovedmuligheder, der kræves for at komme af. Andre er sjældent rørt. Heldig for dig, vi har tid til at røre ved dem alle.

Vigtigste sorteringsmuligheder

Dette er de muligheder, der hjælper dig med at få tingene gjort og sortere (Sortering) ud over at manipulere sorterede resultater (Efterbehandling) og anvende filtre (Filtre) inden sortering.

Sortering

Sortering kommer med 5 forskellige typer sortering. Her er en tabel, der viser hver sorteringstype med tilhørende indstillinger.

Sortere Kort option / lang option / osv
ord
Numerisk sortering (generelt) -g / -general-numerisk-sortering
generelt-numerisk
støtte til videnskabelig notation
0.1234e4 = 1234
Numerisk sortering (menneske) -h / -human-numerisk-sortering
menneskelig-numerisk
1.234K = 1234
Numerisk -n / -nummer-sortering
numerisk
.. < -1 < 0 < 1 <…
Måned -M / -månedsortering
måned
Ukendt < Jan < Feb <… < Nov < Dec
Tilfældig -r /-tilfældig slags
tilfældig
Version -V / -version-sort
version

Bemærk, at hver type type har en lang mulighed, der slutter med -sort. Ud over specifikke sorteringsindstillinger kan indstillingen -sort = WORD bruges til at sortere efter ord. For eksempel kan -sort = tilfældigt bruges i stedet for-tilfældig-slags eller -r.

Eksempler

Her er nogle eksempler på sorteringskommandoer for hver sorteringsmetode.

Eksempel) Sortering af navne

Sortering har ingen problemer med at sortere linjer alfabetisk. Overvej en liste over berømte mennesker, der ikke er sorteret.

Fungere

berømte mennesker()

krølle - stille https: // www.biografi online.net / folk / berømt-100.html
| grep post-indhold | sed -e 's /<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.''

Kommandolinje

berømte mennesker | sortere

Produktion

Stephen King (1947 -)
Steve Jobs (1955-2012)
Sting (1951 -)
Tiger Woods (1975 -)
Tom Cruise (1962 -)
Usain Bolt (1986 -)
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)

Eksempel) Generel numerisk sortering

Hvis vi har brug for at sortere numeriske værdier under hensyntagen til videnskabelig notation såsom 99e2, kan vi bruge generel numerisk sortering.

Fungere

usorterede numeriske værdier ()

seq 100 | sorter - tilfældig sortering | sed '3i 9e2' | sed '3i 99K'

Overvej det sorterede output ved hjælp af hver metode. Bemærk, at listen udover at indeholde værdier 1 til 100 også inkluderer '9e12' (900) og '99K' (99000).

Kommandolinje

usorterede numeriske værdier | sorter -n

Produktion

96
97
98
99
99K
100

Hvad med 900 og 99000. Det er rigtigt, det er bare numerisk sortering. Næste.

Kommandolinje

usorterede numeriske værdier | sorter -h

Produktion

96
97
98
99
100
99K

Hvad med 900. Det er rigtigt, det er bare menneskelig numerisk slags. Næste.

Kommandolinje

usorterede numeriske værdier | sorter -g

Produktion

96
97
98
99
99K
100
9e2

Hvad med 99000. Det er rigtigt, det er bare generel numerisk sortering. Som du ser er ingen sorteringsmetode kompatibel i dette tilfælde; det betyder dog ikke, at du ikke kan komme med en løsning.

Kommandolinje

usorterede numeriske værdier | sed 's / [kK] / e3 /' | sorter -g

Produktion

96
97
98
99
100
9e2
99e3

Nu er det mere som det.

Eksempel) Menneskelig numerisk sortering

Hvis vi har brug for at sortere numeriske værdier under hensyntagen til betydningen af ​​notationer som K, G, M og E, kan vi bruge menneskelig numerisk sortering.

Kommandolinje

seq 100 | sorter - tilfældig sortering | sed '3i 3k' | sorter -h

Produktion

96
97
98
99
100
3k

Eksempel) Numerisk sortering

Hvis alt, hvad vi har brug for, er at sortere heltal, gør numerisk sortering tricket.

Kommandolinje

seq 100 | sorter - tilfældig sortering | sorter - numre-sorter

Produktion

95
96
97
98
99
100

Eksempel) Månedssortering

Månedsortering giver dig mulighed for at bestille linjer efter måned. Det kan vise sig nyttigt at gruppere linjer efter måned, især hvis det ikke er muligt at sortere efter tid.

Fungere

måneder ()

kat  <Jan
Feb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Dec
EOF

Antag, at måneder er ikke sorteret.

Kommandolinje

måneder | sorter - tilfældig slags

Produktion

Mar
Okt
Dec
Apr
Kan
Sep
Aug
Nov
Jul
Jan
Feb
Jun

Vi kan altid sortere efter måned.

Kommandolinje

måneder | sorter - tilfældig sortering | sorter - måned-sortering

Produktion

Jan
Feb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Dec

Bemærk, at hvis vi ændrer Dec til en hvilken som helst understreng i november siger 'Novem', vises den efter 'Nov' i den sorterede output.

Eksempel) Tilfældig sortering - dræb en andens terminal

Som forventet, tilfældig sortering gør det modsatte af sortering, blander linjer.

Antag, at vi med henblik på uddannelse vil dræbe en anden bruger. Vi bliver nødt til at sørge for, at det ikke er vores pty og randomisere listerne, så det er pænere, og at vi kan sige, at ptys blev valgt tilfældigt.

Kommandoer

besked-pty ()


lokal pty;
pty = "$ 1"
;
ekko -n "Du skal ned i"> / dev / $ pty;
for i i 5 4 3 2 1;
gør
sove 1;
ekko -n "$ i"> / dev / $ pty;
Færdig;
ekko "Farvel!"> / dev / $ pty;
sove 1


ps | grep pty | grep -v -e $ (mypty) | sorter - tilfældig sortering | hoved -1> stdin;

besked-pty $ (pty < stdin );
dræb $ (pid < stdin )


Output i andres terminal
Du går ned i 5 4 3 2 1 Farvel!]
(Afslut)

Eksempel) Versionssortering - sortering ips

Som du ved, kan kildefiler være versioneret ved hjælp af strenge som 1.0. Desuden kan versioner gå dybere med versionsnumre som 1.0.0 som set i populære semantiske versioner.

Versionssortering giver dig mulighed for at sortere versionsnumre. Store! Hvad nu? Lad os teste det.

Til dette eksempel har jeg forberedt et bash-script til at generere tilfældige ips, så vi ikke behøver at gå der. Det er i repoen. For de af os, der ikke har repoen, er her en hurtig start.

Kommandoer

git klon https: // github.com / temptemp3 / linuxhint.com.git
alias random-ips = 'test -f "linuxhint.com / generer tilfældig-ips.sh "; bash $ _ '

Nu hvor du er klar, lad os komme i gang.

Kommandolinje

tilfældige-ips 200 | tee ips

Produktion

199.174.177.98
180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145
80.199.197.19
44.214.89.52
185.174.143.111

Okay, det fungerer. Lad os nu se, hvad der sker, når vi prøver at sortere ips.

Kommandolinje

sorter ips

Produktion

76.88.194.157
8.96.11.181
82.169.213.206
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149.111.242
97.121.162.244
98.145.130.186

Ved første øjekast ser det ud til at fungere, men linjer som 8.96.11.181 skal vises andetsteds.

Kommandoer


for o i d h n V g M
gør
sorter ips - $ o> ips $ o ,,
Færdig

ekko alle slags lige numerisk sortering
diff ips n, d 1> / dev / null || ekko ordbog rækkefølge != numerisk sortering
diff ips n, h 1> / dev / null || ekko menneskelig numerisk sortering != numerisk sortering
diff ips n, g 1> / dev / null || ekko generel numerisk sortering != numerisk sortering
diff ips n, v 1> / dev / null ||
ekko version sortering != numerisk sortering
show_n_v_ips_diff = "sandt"


prøve ! "$ show_n_v_ips_diff" || diff ips n, v

Produktion

alle slags lige numeriske sorter
ordbog rækkefølge != numerisk sortering
version sortering != numerisk sortering
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40

Som du ser, giver version sorter dig mulighed for at sortere versionsnumre, når andre sorteringsmetoder mislykkes.

Eksempel) Versionssortering - sortering af filnavne med versionsnumre

Baseret på det sidste eksempel, lad os bruge version sortere lidt tættere på den tilsigtede anvendelse. Som du ved, vises versionsnumre ofte i filnavne. Se Detaljer om sortering af version.

Lad os først omdanne ips til noget andet mere projektkildefil som.

Kommandoer

alfa ()
alpha = "abcdefghijklmnopqrstuvwxyz";
ekko -n $ alpha: $ ((RANDOM% 26)): 1

beta ()
alfa = "ab";
ekko -n $ alpha: $ ((RANDOM% 2)): 1


kat ips | mens læse -r linje; gør
ekko $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).tjære.gz;
færdig | tee sips

Produktion

x-v56.16.109.54.tjære.gz
k-v117.38.14.165a.tjære.gz
d-v87.59.32.91a.tjære.gz
h-v115.215.64.100.tjære.gz
s-v72.174.246.218b.tjære.gz
h-v163.93.19.173.tjære.gz
u-v184.225.11.92b.tjære.gz
y-v205.53.5.211a.tjære.gz
t-v175.196.164.17b.tjære.gz
e-v167.42.221.178b.tjære.gz
c-v126.54.190.189b.tjære.gz
b-v169.180.221.131a.tjære.gz
y-v210.125.170.231a.tjære.gz
x-v71.56.120.9b.tjære.gz

Dyrke motion

Gør ovenstående kommandoer hurtigere ved hjælp af xargs

Se eksempel på, hvordan man bruger kommandoen xargs i bash-scripts.

Denne gang gider vi ikke engang at bruge nogen af ​​de andre sorteringsmetoder.

Kommandolinje

sorter -V sipper

Produktion

d-v127.100.108.192.tjære.gz
e-v62.140.229.42a.tjære.gz
e-v149.77.211.215a.tjære.gz
e-v167.42.221.178b.tjære.gz
e-v194.189.236.29a.tjære.gz
e-v198.145.199.84b.tjære.gz
e-v240.1.147.196b.tjære.gz
f-v50.100.142.42b.tjære.gz
f-v117.58.230.116.tjære.gz
f-v139.17.210.68b.tjære.gz
f-v153.18.145.133b.tjære.gz
g-v201.153.203.60b.tjære.gz
g-v213.58.67.108.tjære.gz
h-v5.206.37.224.tjære.gz

Nu ser du, at versionssortering kan være nyttig, når du sorterer filnavne med versionsnumre.

For sortering

Sortering har fire hovedmuligheder, der påvirker den faktiske sortering, nemlig -ignore-leading-blanks, -ignore-case, -ignore-nonprinting og -diction-order, der måske eller måske ikke overlapper. Eksempel på brug af hver mulighed følger.

Sorter ignorerende førende emner

Sortering tillader, at input-ledende emner ignoreres som en mulighed. Ledende emner bevares i det sorterede output.

Mulighed

--ignorere-førende-blanks

Anvendelse

sorter - store ledende emner

Kommandoer

berømte mennesker> fp
kat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sorter | tac

Produktion

Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)

Bemærk, at mellemrum i linjer tilføjet til fp vises først i sorteringsoutput.

For at løse dette er vi nødt til at ignorere førende emner som følger.

Kommandoer

berømte mennesker> fp
kat >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kat fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac

Produktion

Marilyn Monroe (1926 - 1962)
Marilyn Monroe (1926 - 1962)
Marie Antoinette (1755 - 1793)
..
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)

Alternativer

kat fp | sed 's / ^ \ s * //' | sorter | tac

Bemærk, at alternativet ikke bevarer førende emner i sorteringsoutput.

Sorter ignoreringskasse

Sortering gør det muligt at ignorere input-sager som mulighed. Sagen bevares i det sorterede output.

Mulighed

--ignorere-sag

Anvendelse

sorter - stor sag

Kommandoer

berømte mennesker> fp
kat >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kat fp | sorter | tac

Produktion

Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)

Bemærk, at mellemrum i linjer tilføjet til fp vises først i sorteringsoutput.

For at løse dette er vi nødt til at ignorere ledende emner som følger.

Kommandoer

berømte mennesker> fp
kat >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
kat fp | sort --ignore-case | tac

Produktion

Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)

Alternativer

kat fp | mens læse -r linje; gør ekko $ line ,,; færdig | sorter | tac

Bemærk, at alternativet ikke bevarer store og små bogstaver i sorteringsoutput.

Sorter ignorerer ikke-udskrivning

Sortering tillader ikke-udskrivning af input at blive ignoreret som en mulighed. Ikke-udskrivning bevares i det sorterede output.

Mulighed

--ignorere ikke-udskrivning

Anvendelse

sort --ignore-nonprinting

Kommandoer

berømte mennesker> fp
ekko -e "\ x90Abe" >> fp
kat fp | sorter | tac

Produktion

Audrey Hepburn (1929 - 1993)
Angelina Jolie (1975 -)
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)

Det ser ud til, at vi mangler en 'Abe' -opgave til ikke-udskrivning af tegn i sorteringsinput.

For at løse dette er vi nødt til at ignorere ikke-trykte tegn.

Kommandoer

berømte mennesker> fp
ekko -e "\ x90Abe" >> fp
kat fp | sorter --ignore-nonprinting | tac
[/ cc \
Produktion
[cc lang = "bash"]
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
▒Abe

Sorter ordbogens rækkefølge

Sortering gør det muligt at ignorere alle input undtagen mellemrum og alfanumeriske tegn som en mulighed. Input bevares i den sorterede output.

berømte mennesker> fp
ekko -e "\ x90Abe" >> fp
kat fp | sorter - d | tac

Post sortering

Sortering har en hovedmulighed, der ikke påvirker sortering, nemlig -omvendt. Det påvirker imidlertid output, så det er muligt at skifte rækkefølge mellem stigende og nedadgående. Et eksempel følger.

Sorter omvendt output

Sortering gør det muligt at vise output i omvendt rækkefølge som en mulighed.

Mulighed

--baglæns

Anvendelse

sorter - omvendt

Kommandolinje

berømte mennesker | sorter - omvendt

Produktion

Angelina Jolie (1975 -)
Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)

Alternativer

sorter | tac

Andre muligheder for sortering

Der er toogtyve andre muligheder for sortering. Eksempler følger.

Sorter kontrol

Sort har en mulighed, der giver dig mulighed for at kontrollere, om input er sorteret. Det vender tilbage efter den første forekomst af en usorteret linje. Det er tilfældet, at input skal sorteres, men sandsynligvis allerede er i orden, ved hjælp af sorteringskontrol er passende.

Mulighed

--kontrollere

Anvendelse

sorter - kontroller

Kommandolinje

seq 10 | sorter - tilfældig sortering | sorter - kontroller

Produktion

sorter: -: 3: lidelse: 10

Kommandolinje

seq 10 | sorter - tilfældig sortering | sorter | sorter - kontroller

Produktion

(blank)

Sorter output

Sort har en mulighed, der giver dig mulighed for at angive en fil, du vil skrive til, i stedet for at bruge standardoutput eller omdirigering. Dets anvendelse kan forbedre kompatibiliteten på tværs af scripting-miljøer.

Mulighed

--output = FIL

Anvendelse

sorter - output = FIL

Kommandolinje

seq 10 | sorter - tilfældig sortering - output = tilfældig-10

Produktion

(blank)

Sorter null afsluttet

Sort har en mulighed, der giver dig mulighed for at indstille linjeskilleren til null i stedet for en ny linje.

Mulighed

--nulteret

Anvendelse

sorter - nul-afsluttet

Kommandolinje

seq 10 | tr '\ 012' '\ 000' | sorter - nul-afsluttet - tilfældig sortering

Produktion

25346178910

Sorter stabilt

Sortering har en mulighed, der giver dig mulighed for at deaktivere sammenligning mellem sidste udvej. Som et resultat kan der opnås mere stabile driftstider i tilfælde af store nok input, der kan få sort til at køre ustabil.

Mulighed

--stabil

Anvendelse

sorter - stabil

Kommandolinje

tid seq 1000000 | sorter - tilfældig sortering | sorter - stabil> / dev / null

Produktion

rigtig 0m9.138s
bruger 0m9.201'ere
sys 0m0.107s

Sorter bufferstørrelse

Sort har en mulighed, der giver dig mulighed for at indstille mængden af ​​hukommelse, der bruges som buffer under sortering. Det kan bruges til at begrænse hukommelsesforbruget ved at sortere større indgange. Ydeevne kan blive påvirket.

Mulighed

--buffer-størrelse = STØRRELSE

Anvendelse

sorter - bufferstørrelse = 64

Kommandolinje

tid seq 1000000 | sorter-tilfældig-sorter | sorter -stabil -buffer-size = 64> / dev / null

Produktion

rigtig 0m21.685s
bruger 0m9.858s
sys 0m2.092s

Sorter unikt

Sort har en mulighed, der giver dig mulighed for at fjerne duplikatlinjer i sorteringsoutput

Mulighed

--enestående

Anvendelse

sorter - unik

Kommandolinje

ekko 1 2 2 4 5 | tr '\ 040' '\ 000' | sorter - nul-afsluttet - unik

Produktion

1245

Alternativer

sorter | uniq

Konklusion

Sortering er en ekstern kommando, der ikke kun er nyttig, når den bruges i kombination med andre eksterne kommandoer, men også praktisk, når den bruges med kommandoer uden indbygget bestillingsmetode, såsom en brugerdefineret funktion eller bash-scripts generelt.

Sådan installeres og afspilles Doom på Linux
Introduktion til undergang Doom-serien opstod i 90'erne efter frigivelsen af ​​den originale Doom. Det var et øjeblikkeligt hit, og fra den tid af har...
Vulkan til Linux-brugere
Med hver nye generation af grafikkort ser vi spiludviklere skubbe grænserne for grafisk troskab og komme et skridt tættere på fotorealisme. Men på tro...
OpenTTD vs Simutrans
Oprettelse af din egen transportsimulering kan være sjovt, afslappende og ekstremt lokkende. Derfor skal du sørge for at prøve så mange spil som mulig...