Med sortering kan du bestille filer basert på rekkefølgen i ordboken eller etter numerisk verdi, randomisere fillinjer, fjerne duplikatlinjer og sjekke om en fil er sortert.
Du kan kanskje gjøre andre ting med det, men la oss først bekymre deg for å pakke hodet rundt hvordan vi kan bruke sortering i bash-skript.
Hva er sortering??
Sortering er en ekstern kommando som sammenkobler filer mens de sorterer innholdet etter en sorteringstype og skriver resultatene av sorteringen til standardutdata.
Sorter kommandoalternativer for bash
Sorteringskommandoen kommer med 31 alternativer (13 hoved og 18 kategorisert som andre). Mest erfarne bash-programmering (til og med eksperter) kjenner bare noen få hovedsorteringsalternativer som kreves for å klare seg. Andre blir sjelden berørt. Heldig for deg vi har tid til å ta på dem alle.
Hovedsorteringsalternativer
Dette er alternativene som hjelper deg med å få ting gjort og sortere (Sortering) i tillegg til å manipulere sorterte resultater (Etterbehandling) og bruke filtre (Filtre) før sortering.
Sortering
Sortering kommer med 5 forskjellige typer sortering. Her er en tabell som viser hver sorteringstype med tilhørende alternativer.
Sortere | Kort alternativ / langt alternativ / etc ord |
Numerisk sortering (generelt) | -g / -general-numerisk-sort generell-numerisk støtte for vitenskapelig notasjon 0.1234e4 = 1234 |
Numerisk sortering (menneskelig) | -h / -human-numeric-sort menneskelig-numerisk 1.234K = 1234 |
Numerisk | -n / -nummer-sortering numerisk .. < -1 < 0 < 1 <… |
Måned | -M / -månedsortering måned Ukjent < Jan < Feb <… < Nov < Dec |
Tilfeldig | -r / -random-sort tilfeldig |
Versjon | -V / -versjon-sortering versjon |
Merk at hver type type har et langt alternativ som slutter med -sort. I tillegg til spesifikke sorteringsalternativer, kan alternativet -sort = WORD brukes til å sortere etter ord. For eksempel kan -sort = random brukes i stedet for -random-sort eller -r.
Eksempler
Her er noen eksempler på sorteringskommandoer for hver sorteringsmetode.
Eksempel) Sortering av navn
Sortering har ingen problemer med å sortere linjer alfabetisk. Vurder en liste over kjente personer som ikke er sortert.
Funksjon
berømte mennesker()krøll - stille https: // www.biografi på nettet.nett / folk / berømt-100.html
| grep etter innhold | 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
kjente personer | sortereProduksjon
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) Generell numerisk sortering
Hvis vi trenger å sortere numeriske verdier med vitenskapelig betegnelse som 99e2, kan vi bruke generell numerisk sortering.
Funksjon
usorterte numeriske verdier ()seq 100 | sorter - tilfeldig-sorter | sed '3i 9e2' | sed '3i 99K'
Vurder det sorterte resultatet ved hjelp av hver metode. Merk at listen i tillegg til å inneholde verdiene 1 til 100, også inneholder '9e12' (900) og '99K' (99000).
Kommandolinje
usorterte numeriske verdier | sorter -nProduksjon
9697
98
99
99K
100
Hva med 900 og 99000. Det stemmer, det er bare numerisk sortering. Neste.
Kommandolinje
usorterte numeriske verdier | sorter -hProduksjon
9697
98
99
100
99K
Hva med 900. Det stemmer, det er bare menneskelig numerisk sortering. Neste.
Kommandolinje
usorterte numeriske verdier | sorter -gProduksjon
9697
98
99
99K
100
9e2
Hva med 99000. Det stemmer, det er bare generell numerisk sortering. Som du ser er ingen sorteringsmetode kompatibel i dette tilfellet; Det betyr imidlertid ikke at du ikke kan komme med en løsning.
Kommandolinje
usorterte numeriske verdier | sed 's / [kK] / e3 /' | sorter -gProduksjon
9697
98
99
100
9e2
99e3
Nå er det mer som det.
Eksempel) Menneskelig numerisk sortering
Hvis vi trenger å sortere numeriske verdier med tanke på betydningen av notasjoner som K, G, M og E, kan vi bruke menneskelig numerisk sortering.
Kommandolinje
seq 100 | sorter - tilfeldig-sorter | sed '3i 3k' | sorter -hProduksjon
9697
98
99
100
3k
Eksempel) Numerisk sortering
Hvis alt vi trenger er å sortere heltall numerisk sortering gjør susen.
Kommandolinje
seq 100 | sorter - tilfeldig-sorter | sorter - nummer-sorterProduksjon
9596
97
98
99
100
Eksempel) Månedssortering
Månedsortering lar deg bestille linjer etter måned. Det kan være nyttig for gruppering av linjer etter måned, spesielt i tilfelle at muligheten for å sortere etter tid ikke er tilgjengelig.
Funksjon
måneder ()katt <
Feb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Des
EOF
Anta at det er måneder, blir ikke sortert.
Kommandolinje
måneder | sorter - tilfeldig-sorterProduksjon
MarOkt
Des
Apr
Kan
Sep
Aug
Nov
Jul
Jan
Feb
Jun
Vi kan alltid sortere etter måned.
Kommandolinje
måneder | sorter - tilfeldig-sortering | sorter - månedssorteringProduksjon
JanFeb
Mar
Apr
Kan
Jun
Jul
Aug
Sep
Okt
Nov
Des
Merk at hvis vi endrer desember til en hvilken som helst understreng i november, sier 'Novem', vil den vises etter 'Nov' i den sorterte utgangen.
Eksempel) Tilfeldig sortering - drep en andres terminal
Som forventet gjør tilfeldig sorter det motsatte av sortering, blander linjer.
Anta at vi for utdanningsformål vil drepe en annen bruker. Vi må sørge for at det ikke er vår pty og randomisere oppføringene slik at de er bedre og at vi kan si at PTY er valgt tilfeldig.
Kommandoer
melding-pty ()lokal pty;
pty = "$ 1"
;
ekko -n "Du skal ned i"> / dev / $ pty;
for i i 5 4 3 2 1;
gjøre
sove 1;
ekko -n "$ i"> / dev / $ pty;
gjort;
ekko "Bye!"> / dev / $ pty;
sove 1
ps | grep pty | grep -v -e $ (mypty) | sorter - tilfeldig-sortering | hode -1> stdin;
melding-pty $ (pty < stdin );
drep $ (pid < stdin )
Utgang i andres terminal
Du går ned i 5 4 3 2 1 Bye!]
(exit)
Eksempel) Versjonssortering - sortering av ips
Som du vet kan kildefiler versjoneres ved hjelp av strenger som 1.0. Videre kan versjoner gå dypere med versjonsnumre som 1.0.0 slik som sett i populære semantiske versjonsskjemaer.
Versjonssortering lar deg sortere versjonsnumre. Flott! Hva nå? La oss teste det ut.
For dette eksemplet har jeg utarbeidet et bash-skript for å generere tilfeldige ips slik at vi ikke trenger å dra dit. Det er i repoen. For de av oss som ikke har repoen, er det en rask start.
Kommandoer
git klon https: // github.com / temptemp3 / linuxhint.com.gitalias random-ips = 'test -f "linuxhint.com / generere-tilfeldig-ips.sh "; bash $ _ '
Nå som du er klar, la oss komme i gang.
Kommandolinje
random-ips 200 | tee ipsProduksjon
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
Det fungerer. La oss nå se hva som skjer når vi prøver å sortere ips.
Kommandolinje
sorter ipsProduksjon
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 øyekast ser det ut til å fungere, men linjer som 8.96.11.181 skal vises andre steder.
Kommandoer
for o i d h n V g M
gjøre
sorter ips - $ o> ips $ o ,,
ferdig
ekko alle slags like numeriske sorter
diff ips n, d 1> / dev / null || ekko ordbok rekkefølge != numerisk sortering
diff ips n, h 1> / dev / null || ekko menneskelig numerisk sortering != numerisk sortering
diff ips n, g 1> / dev / null || ekko generell numerisk sortering != numerisk sortering
diff ips n, v 1> / dev / null ||
ekko versjon sorter != numerisk sortering
show_n_v_ips_diff = "true"
test ! "$ show_n_v_ips_diff" || diff ips n, v
Produksjon
alle slags like numeriske sorterordbokrekkefølge != numerisk sortering
versjonssortering != 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, kan versjon sortere deg sortere versjonsnumre når andre sorteringsmetoder mislykkes.
Eksempel) Versjonssortering - sortering av filnavn med versjonsnumre
Basert på det siste eksemplet, la oss bruke versjonen sortere litt nærmere den tiltenkte bruken. Som du vet, vises versjonsnumre ofte i filnavn. Se Detaljer om versjonssortering.
La oss først forvandle ips til noe annet mer prosjektkildefil.
Kommandoer
alfa ()alpha = "abcdefghijklmnopqrstuvwxyz";
ekko -n $ alpha: $ ((RANDOM% 26)): 1
beta ()
alfa = "ab";
ekko -n $ alpha: $ ((RANDOM% 2)): 1
katt-ips | mens du leser -r linje; gjøre
ekko $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).tjære.gz;
ferdig | tee slurker
Produksjon
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
Trening
Gjør ovennevnte kommandoer raskere ved hjelp av xargs
Se eksempel på hvordan du bruker xargs-kommandoen i bash-skript.
Denne gangen gidder vi ikke engang å bruke noen av de andre sorteringsmetodene.
Kommandolinje
sorter -V nipperProduksjon
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
Nå ser du at versjonssortering kan være nyttig når du sorterer filnavn med versjonsnummer.
Forhåndssorter
Sortering har fire hovedalternativer som påvirker faktisk sortering, nemlig -ignore-leading-blanks, -ignore-case, -ignore-nonprinting og -diction-order, som kanskje eller ikke overlapper. Eksempel på bruk av hvert alternativ følger.
Sorter ignorering av ledende emner
Sortering gjør det mulig å ignorere inngangsledende emner som et alternativ. Ledende emner er bevart i den sorterte utgangen.
Alternativ
--ignorere-ledende-blanksBruk
sorter - store ledereKommandoer
kjente personer> fpkatt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sorter | tac
Produksjon
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Merk at ledende mellomrom i linjer lagt til fp vises først i sorteringsutdata.
For å fikse dette må vi ignorere ledende emner som følger.
Kommandoer
kjente personer> fpkatt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac
Produksjon
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
katt fp | sed 's / ^ \ s * //' | sorter | tacMerk at alternativet ikke bevarer ledende emner i sorteringsutdata.
Sorter ignoreringstilfelle
Sortering gjør at inndatasak kan ignoreres som et alternativ. Saken er bevart i den sorterte utdata.
Alternativ
--ignorere sakenBruk
sorter - stor sakKommandoer
kjente personer> fpkatt >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sorter | tac
Produksjon
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
Merk at ledende mellomrom i linjer lagt til fp vises først i sorteringsutdata.
For å fikse dette må vi ignorere ledende emner som følger.
Kommandoer
kjente personer> fpkatt >> fp << EOF
Abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sort --ignore-case | tac
Produksjon
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
katt fp | mens du leser -r linje; gjør ekko $ line ,,; ferdig | sorter | tacMerk at alternativet ikke bevarer store og små bokstaver i sorteringsutdata.
Sorter ignorering uten utskrift
Sortering gjør at ikke-utskrift av input kan ignoreres som et alternativ. Ikke-utskrift bevares i den sorterte utdataene.
Alternativ
--ignorere-ikke-utskriftBruk
sort --ignore-nonprintingKommandoer
kjente mennesker> fpekko -e "\ x90Abe" >> fp
katt fp | sorter | tac
Produksjon
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 ut til at vi mangler et 'Abe' -gjenstand mot tegn som ikke skrives ut i sorteringsinndata.
For å fikse dette må vi ignorere tegn som ikke er utskrift.
Kommandoer
kjente mennesker> fpekko -e "\ x90Abe" >> fp
katt fp | sort --ignore-nonprinting | tac
[/ cc \
Produksjon
[cc lang = "bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
▒Abe
Sorter ordboksrekkefølgen
Sortering lar alle inndata ignoreres, unntatt mellomrom og alfanumeriske tegn som et alternativ. Inndata bevares i den sorterte utgangen.
kjente personer> fpekko -e "\ x90Abe" >> fp
katt fp | sorter - d | tac
Innleggssortering
Sortering har ett hovedalternativ som ikke påvirker sortering, nemlig -omvendt. Imidlertid påvirker det utdataene, slik at rekkefølge kan byttes mellom stigende og synkende. Et eksempel følger.
Sorter omvendt utdata
Sortering gjør at utdata kan vises i omvendt rekkefølge som et alternativ.
Alternativ
--omvendtBruk
sorter - omvendtKommandolinje
kjente personer | sorter - omvendtProduksjon
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 alternativer for sortering
Det er tjueto andre alternativer for sortering. Eksempler følger.
Sorter sjekk
Sortering har et alternativ som lar deg sjekke om inngangen er sortert. Den returnerer etter første forekomst av en usortert linje. Det er tilfelle at input kreves sortert, men sannsynligvis allerede er i orden, og bruk av sorteringskontroll er passende.
Alternativ
--SjekkBruk
sorter - sjekkKommandolinje
seq 10 | sorter - tilfeldig-sorter | sorter - sjekkProduksjon
sorter: -: 3: lidelse: 10Kommandolinje
seq 10 | sorter - tilfeldig-sorter | sorter | sorter - sjekkProduksjon
(blank)Sorter utdata
Sort har et alternativ som lar deg spesifisere en fil å skrive til i stedet for å bruke standard utdata eller omdirigering. Bruken av den kan forbedre kompatibiliteten i skriptmiljøer.
Alternativ
--utgang = FILBruk
sorter - utgang = FILKommandolinje
seq 10 | sorter - tilfeldig sorter - utgang = tilfeldig-10Produksjon
(blank)Sorter null avsluttet
Sort har et alternativ som lar deg sette linjeavgrenseren til null i stedet for en ny linje.
Alternativ
--null-avsluttetBruk
sorter - null-avsluttetKommandolinje
seq 10 | tr '\ 012' '\ 000' | sorter - null-avsluttet - tilfeldig-sorterProduksjon
25346178910Sorter stabilt
Sort har et alternativ som lar deg deaktivere sammenligning av siste utvei. Som et resultat kan mer stabile kjøretider oppnås i tilfelle store nok innganger som kan føre til at sort kjører ustabil.
Alternativ
--stabilBruk
sorter - stabilKommandolinje
tid seq 1000000 | sorter - tilfeldig-sorter | sorter - stabil> / dev / nullProduksjon
ekte 0m9.138-talletbruker 0m9.201-tallet
sys 0m0.107-tallet
Sorter bufferstørrelse
Sortering har et alternativ som lar deg angi hvor mye minne som skal brukes som buffer mens du sorterer. Den kan brukes til å begrense minneforbruk ved å sortere større innganger. Ytelsen kan bli påvirket.
Alternativ
--bufferstørrelse = STØRRELSEBruk
sorter - bufferstørrelse = 64Kommandolinje
tid seq 1000000 | sorter-tilfeldig-sorter | sorter -stabil -buffer-size = 64> / dev / null
Produksjon
ekte 0m21.685sbruker 0m9.858-tallet
sys 0m2.092-tallet
Sorter unikt
Sortering har et alternativ som lar deg fjerne dupliserte linjer i sorteringsutdata
Alternativ
--unikBruk
sorter - unikKommandolinje ekko 1 2 2 4 5 | tr '\ 040' '\ 000' | sorter - null-avsluttet - unik
Produksjon
1245Alternativer
sorter | uniqKonklusjon
Sortering er en ekstern kommando som er nyttig ikke bare når den brukes i kombinasjon med andre eksterne kommandoer, men er også nyttig når den brukes med kommandoer uten innebygd bestillingsmetode, for eksempel en brukerdefinert funksjon eller bash-skript generelt.