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 | sortereProduktion
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 -nProduktion
9697
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 -hProduktion
9697
98
99
100
99K
Hvad med 900. Det er rigtigt, det er bare menneskelig numerisk slags. Næste.
Kommandolinje
usorterede numeriske værdier | sorter -gProduktion
9697
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 -gProduktion
9697
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 -hProduktion
9697
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-sorterProduktion
9596
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 <
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 slagsProduktion
MarOkt
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-sorteringProduktion
JanFeb
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.gitalias 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 ipsProduktion
199.174.177.98180.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 ipsProduktion
76.88.194.1578.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 sorterordbog 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.gzk-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 sipperProduktion
d-v127.100.108.192.tjære.gze-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-blanksAnvendelse
sorter - store ledende emnerKommandoer
berømte mennesker> fpkat >> 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> fpkat >> 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 | tacBemæ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-sagAnvendelse
sorter - stor sagKommandoer
berømte mennesker> fpkat >> 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> fpkat >> 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 | tacBemæ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-udskrivningAnvendelse
sort --ignore-nonprintingKommandoer
berømte mennesker> fpekko -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> fpekko -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> fpekko -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ænsAnvendelse
sorter - omvendtKommandolinje
berømte mennesker | sorter - omvendtProduktion
Angelina Jolie (1975 -)Amelia Earhart (1897-1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternativer
sorter | tacAndre 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
--kontrollereAnvendelse
sorter - kontrollerKommandolinje
seq 10 | sorter - tilfældig sortering | sorter - kontrollerProduktion
sorter: -: 3: lidelse: 10Kommandolinje
seq 10 | sorter - tilfældig sortering | sorter | sorter - kontrollerProduktion
(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 = FILAnvendelse
sorter - output = FILKommandolinje
seq 10 | sorter - tilfældig sortering - output = tilfældig-10Produktion
(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
--nulteretAnvendelse
sorter - nul-afsluttetKommandolinje
seq 10 | tr '\ 012' '\ 000' | sorter - nul-afsluttet - tilfældig sorteringProduktion
25346178910Sorter 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
--stabilAnvendelse
sorter - stabilKommandolinje
tid seq 1000000 | sorter - tilfældig sortering | sorter - stabil> / dev / nullProduktion
rigtig 0m9.138sbruger 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ØRRELSEAnvendelse
sorter - bufferstørrelse = 64Kommandolinje
tid seq 1000000 | sorter-tilfældig-sorter | sorter -stabil -buffer-size = 64> / dev / null
Produktion
rigtig 0m21.685sbruger 0m9.858s
sys 0m2.092s
Sorter unikt
Sort har en mulighed, der giver dig mulighed for at fjerne duplikatlinjer i sorteringsoutput
Mulighed
--eneståendeAnvendelse
sorter - unikKommandolinje ekko 1 2 2 4 5 | tr '\ 040' '\ 000' | sorter - nul-afsluttet - unik
Produktion
1245Alternativer
sorter | uniqKonklusion
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.