Med sortering kan du beställa filer baserat på ordningen i ordboken eller genom numeriskt värde, randomisera filrader, ta bort dubbla rader och kontrollera om en fil är sorterad.
Du kanske kan göra andra saker med det, men först, låt oss oroa oss för att slå in våra huvuden kring hur man använder sortering i bash-skript.
Vad är sortering?
Sortera är ett externt kommando som sammanfogar filer medan de sorterar deras innehåll efter en sorteringstyp och skriver resultat av sortering till standardutdata.
Sortera kommandoalternativ för bash
Sorteringskommandot kommer med 31 alternativ (13 huvud och 18 kategoriserade som andra). De flesta erfarna bash-programmeringar (till och med experter) känner bara till några få huvudsorteringsalternativ som krävs för att klara sig. Andra berörs sällan. Tur för dig att vi har tid att röra vid dem alla.
Huvudsorteringsalternativ
Det här är alternativen som hjälper dig att få saker gjorda och sortera (sortering) förutom att manipulera sorterade resultat (efterbehandling) och tillämpa filter (filter) före sortering.
Sortering
Sortering kommer med 5 olika sorteringar. Här är en tabell som visar varje sorttyp med tillhörande alternativ.
Sortera | Kort alternativ / långt alternativ / etc ord |
Numerisk sortering (allmänt) | -g / -general-numerisk-sortering allmänt numeriskt stöd för vetenskaplig notation 0.1234e4 = 1234 |
Numerisk sortering (mänsklig) | -h / -human-numeric-sort mänskligt numeriskt 1.234K = 1234 |
Numerisk | -n / -nummer-sortering numerisk .. < -1 < 0 < 1 <… |
Månad | -M / -månadssortering månad Okänd < Jan < Feb <… < Nov < Dec |
Slumpmässig | -r /-slumpmässig sort slumpmässig |
Version | -V / -version-sort version |
Observera att varje typ av sort har ett långt alternativ som slutar med -sort. Förutom specifika sorteringsalternativ kan alternativet -sort = WORD användas för att sortera efter ord. Till exempel -sort = slumpmässigt kan användas i stället för -random-sort eller -r.
Exempel
Här är några exempel på sorteringskommandon för varje sorteringsmetod.
Exempel) Sortering av namn
Sortera har inga problem att sortera rader alfabetiskt. Tänk på en lista över kända personer som inte är sorterade.
Fungera
kända människor()curl --silent https: // www.biografi online.nät / personer / berömd-100.html
| grep efter innehåll | sed -e's /<[^>] *.// g '-e' s / WWII // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+.''
Kommandorad
kända människor | sorteraProduktion
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)
Exempel) Allmän numerisk sortering
Om vi behöver sortera numeriska värden med vetenskaplig notation som 99e2 kan vi använda generell numerisk sortering.
Fungera
osorterade-numeriska värden ()sek 100 | sortera - slumpmässigt sortera | sed '3i 9e2' | sed '3i 99K'
Tänk på den sorterade produktionen med varje metod. Observera att listan förutom att innehålla värden 1 till 100 också innehåller '9e12' (900) och '99K' (99000).
Kommandorad
osorterade numeriska värden | sortera -nProduktion
9697
98
99
99K
100
Vad sägs om 900 och 99000. Det stämmer, det är bara numerisk sortering. Nästa.
Kommandorad
osorterade numeriska värden | sortera -hProduktion
9697
98
99
100
99K
Vad sägs om 900. Det stämmer, det är bara mänsklig numerisk sortering. Nästa.
Kommandorad
osorterade numeriska värden | sortera -gProduktion
9697
98
99
99K
100
9e2
Vad sägs om 99000. Det stämmer, det är bara generell numerisk sortering. Som ni ser är ingen sorteringsmetod kompatibel i det här fallet; det betyder dock inte att du inte kan komma med en fix.
Kommandorad
osorterade numeriska värden | sed's / [kK] / e3 / '| sortera -gProduktion
9697
98
99
100
9e2
99e3
Nu är det mer som det.
Exempel) Mänsklig numerisk sortering
Om vi behöver sortera numeriska värden med hänsyn till betydelsen av notationer som K, G, M och E, kan vi använda mänsklig numerisk sortering.
Kommandorad
sek 100 | sortera - slumpmässig sortering | sed '3i 3k' | sortera -hProduktion
9697
98
99
100
3k
Exempel) Numerisk sortering
Om allt vi behöver är att sortera heltal gör numerisk sortering tricket.
Kommandorad
sek 100 | sortera - slumpmässig sortering | sortera - nummer-sorteraProduktion
9596
97
98
99
100
Exempel) Månadssortering
Månadssortering låter dig beställa rader efter månad. Det kan visa sig vara användbart för att gruppera rader efter månad, särskilt om alternativet att sortera efter tid inte är tillgängligt.
Fungera
månader ()katt <
Feb
Mar
Apr
Maj
Juni
Jul
Aug
Sep
Okt
Nov
Dec
EOF
Antag att månader är inte sorterade.
Kommandorad
månader | sortera - slumpmässig sorteringProduktion
MarOkt
Dec
Apr
Maj
Sep
Aug
Nov
Jul
Jan
Feb
Juni
Vi kan alltid sortera efter månad.
Kommandorad
månader | sortera - slumpmässigt sortera | sortera - månadsorteringProduktion
JanFeb
Mar
Apr
Maj
Juni
Jul
Aug
Sep
Okt
Nov
Dec
Observera att om vi ändrar dec till någon substring i november säger "Novem", kommer det att visas efter "Nov" i den sorterade utdata.
Exempel) Slumpmässig sortering - döda någon annans terminal
Som förväntat, slumpmässig sortering gör motsatsen till sortering, blandar upp linjer.
Antag att vi för utbildningsändamål vill döda en annan användare. Vi måste se till att det inte är vår pty och randomisera listorna så att det är trevligare och att vi kan säga att ptys valdes slumpmässigt.
Kommandon
meddelande-pty ()lokal pty;
pty = "$ 1"
;
echo -n "Du går ner i"> / dev / $ pty;
för i i 5 4 3 2 1;
do
sova 1;
echo -n "$ i"> / dev / $ pty;
Gjort;
eko "Hejdå!"> / dev / $ pty;
sova 1
ps | grep pty | grep -v -e $ (mypty) | sortera - slumpmässigt sortera | huvud -1> stdin;
meddelande-pty $ (pty < stdin );
döda $ (pid < stdin )
Output i någon annans terminal
Du går ner i 5 4 3 2 1 Hejdå!]
(utgång)
Exempel) Versionsortering - sorterings-ips
Som du vet kan källfiler versioneras med strängar som 1.0. Dessutom kan versioner gå djupare med versionsnummer som 1.0.0 som ses i populära semantiska versioner.
Versionssortering låter dig sortera versionsnummer. Bra! Nu då? Låt oss testa det.
För det här exemplet har jag förberett ett bash-skript för att generera slumpmässiga ips så att vi inte behöver åka dit. Det är i repo. För de av oss som inte har repo här är en snabb start.
Kommandon
git klon https: // github.com / temptemp3 / linuxhint.com.gitalias random-ips = 'test -f "linuxhint.com / generera-slumpmässiga ips.sh "; bash $ _ '
Nu när du är redo ska vi komma igång.
Kommandorad
random-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
Okej, det fungerar. Låt oss nu se vad som händer när vi försöker sortera ips.
Kommandorad
sortera 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
Vid första anblicken verkar det fungera men linjer som 8.96.11.181 bör visas någon annanstans.
Kommandon
för o i d h n V g M
do
sortera ips - $ o> ips $ o ,,
Gjort
eko alla sorter lika numerisk sortering
diff ips n, d 1> / dev / null || eko ordbok ordning != numerisk sortering
diff ips n, h 1> / dev / null || eko mänsklig numerisk sortering != numerisk sortering
diff ips n, g 1> / dev / null || eko generell numerisk sortering != numerisk sortering
diff ips n, v 1> / dev / null ||
echo version sort != numerisk sortering
show_n_v_ips_diff = "sant"
testa ! "$ show_n_v_ips_diff" || diff ips n, v
Produktion
alla slags lika numeriska sorterordbok ordning != numerisk sortering
version sortera != 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 version sort kan du sortera versionsnummer när andra sorteringsmetoder misslyckas.
Exempel) Versionssortering - sortering av filnamn med versionsnummer
Baserat på det sista exemplet, låt oss använda version sortera lite närmare dess avsedda användning. Som ni vet visas versionsnummer ofta i filnamn. Se Detaljer om sortering av versioner.
Låt oss först omvandla ips till något annat mer projektkällfil som.
Kommandon
alfa ()alfa = "abcdefghijklmnopqrstuvwxyz";
eko -n $ alfa: $ ((RANDOM% 26)): 1
beta ()
alfa = "ab";
eko -n $ alfa: $ ((RANDOM% 2)): 1
katt-ips | medan läs -r rad; do
echo $ (alpha) -v $ line $ (test $ ((RANDOM% 5)) -eq 0 || beta).tjära.gz;
gjort | tee sips
Produktion
x-v56.16.109.54.tjära.gzk-v117.38.14.165a.tjära.gz
d-v87.59.32.91a.tjära.gz
h-v115.215.64.100.tjära.gz
s-v72.174.246.218b.tjära.gz
h-v163.93.19.173.tjära.gz
u-v184.225.11.92b.tjära.gz
y-v205.53.5.211a.tjära.gz
t-v175.196.164.17b.tjära.gz
e-v167.42.221.178b.tjära.gz
c-v126.54.190.189b.tjära.gz
b-v169.180.221.131a.tjära.gz
y-v210.125.170.231a.tjära.gz
x-v71.56.120.9b.tjära.gz
Övning
Gör ovanstående kommandon snabbare med xargs
Se exempel på hur man använder kommandot xargs i bash-skript.
Den här gången kommer vi inte ens bry oss om att använda någon av de andra sorteringsmetoderna.
Kommandorad
sortera -V sipparProduktion
d-v127.100.108.192.tjära.gze-v62.140.229.42a.tjära.gz
e-v149.77.211.215a.tjära.gz
e-v167.42.221.178b.tjära.gz
e-v194.189.236.29a.tjära.gz
e-v198.145.199.84b.tjära.gz
e-v240.1.147.196b.tjära.gz
f-v50.100.142.42b.tjära.gz
f-v117.58.230.116.tjära.gz
f-v139.17.210.68b.tjära.gz
f-v153.18.145.133b.tjära.gz
g-v201.153.203.60b.tjära.gz
g-v213.58.67.108.tjära.gz
h-v5.206.37.224.tjära.gz
Nu ser du att versionssortering kan vara användbar när du sorterar filnamn med versionsnummer.
Försortera
Sortering har fyra huvudalternativ som påverkar faktisk sortering, nämligen -ignore-leading-blank, -ignore-case, -ignore-nonprinting och -diction-order, som kanske eller inte kan överlappa. Exempel på varje alternativ följ.
Sortera ignorerande ledande ämnen
Sortering gör att ingående ledande ämnen kan ignoreras som ett alternativ. Ledande ämnen bevaras i den sorterade utgången.
Alternativ
--ignorera-ledande ämnenAnvändande
sortera - stora ledande ämnenKommandon
kända personer> fpkatt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt fp | sortera | 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)
Observera att ledande mellanslag i rader som läggs till i fp visas först i sorteringsutdata.
För att åtgärda detta måste vi ignorera ledande ämnen enligt följande.
Kommandon
kända personer> fpkatt >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
katt 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)
Alternativ
katt fp | sed 's / ^ \ s * //' | sortera | tacObservera att alternativet inte bevarar ledande ämnen i sorteringsutdata.
Sortera ignoreringsfall
Sortering gör att inmatningsfall kan ignoreras som ett alternativ. Fallet bevaras i den sorterade utdata.
Alternativ
--ignorera fallAnvändande
sort --ignore-caseKommandon
kända personer> fpkatt >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt fp | sortera | 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)
Observera att ledande mellanslag i rader som läggs till i fp visas först i sorteringsutdata.
För att åtgärda detta måste vi ignorera ledande ämnen enligt följande.
Kommandon
kända personer> fpkatt >> fp << EOF
abraham Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
katt 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)
Alternativ
katt fp | medan läs -r rad; echo $ line ,,; gjort | sortera | tacObservera att alternativet inte behåller skiftläge i sorteringsutdata.
Sortera ignorerar icke-utskrift
Sortering gör att inmatning utan utskrift kan ignoreras som ett alternativ. Icke-utskrift bevaras i den sorterade utdata.
Alternativ
--ignorera-icke-utskriftAnvändande
sortera --ignore-nonprintingKommandon
kända personer> fpeko -e "\ x90Abe" >> fp
katt fp | sortera | 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 verkar som om vi saknar ett 'Abe' -arbete för tecken som inte skrivs ut i sorteringsinmatning.
För att åtgärda detta måste vi ignorera tecken som inte skrivs ut.
Kommandon
kända personer> fpeko -e "\ x90Abe" >> fp
katt fp | sortera --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)
BeAbe
Sortera ordbokens ordning
Sortering tillåter att alla inmatningar ignoreras utom mellanslag och alfanumeriska tecken som ett alternativ. Ingången bevaras i den sorterade utdata.
kända personer> fpeko -e "\ x90Abe" >> fp
katt fp | sortera --d | tac
Post sortera
Sortering har ett huvudalternativ som inte påverkar sorteringen, nämligen -omvänd. Det påverkar emellertid utdata, så att ordning kan växlas mellan stigande och fallande. Ett exempel följer.
Sortera omvänd utdata
Sortering gör att utdata kan visas i omvänd ordning som ett alternativ.
Alternativ
--omvändAnvändande
sortera - omvändKommandorad
kända människor | sortera - omvändProduktion
Angelina Jolie (1975 -)Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 -)
Abraham Lincoln (1809 - 1865)
Alternativ
sortera | tacAndra sorteringsalternativ
Det finns tjugotvå andra alternativ för sortering. Exempel följer.
Sorteringskontroll
Sortering har ett alternativ som låter dig kontrollera om ingången är sorterad. Den återkommer efter den första instansen av en osorterad rad. Det är fallet att ingången måste sorteras men sannolikt redan är i ordning, med hjälp av sorteringskontroll är lämpligt.
Alternativ
--kolla uppAnvändande
sortera --kollaKommandorad
seq 10 | sortera - slumpmässig sortering | sortera --kollaProduktion
sortera: -: 3: störning: 10Kommandorad
seq 10 | sortera - slumpmässig sortering | sortera | sortera --kollaProduktion
(tom)Sortera utdata
Sortera har ett alternativ som låter dig ange en fil att skriva till istället för att använda standardutdata eller omdirigering. Dess användning kan förbättra kompatibiliteten mellan skriptmiljöer.
Alternativ
--output = FILAnvändande
sortera --output = FILKommandorad
seq 10 | sortera - slumpmässig sortering - utdata = slumpmässig-10Produktion
(tom)Sortera null avslutad
Sortering har ett alternativ som låter dig ställa in linjeavgränsaren till null istället för en ny rad.
Alternativ
--nollavslutadAnvändande
sortera - nollavslutadKommandorad
seq 10 | tr '\ 012' '\ 000' | sortera - nollavslutad - slumpmässig sorteringProduktion
25346178910Sortera stabilt
Sortera har ett alternativ som gör att du kan inaktivera jämförelse mellan sista utväg. Som ett resultat kan mer stabila driftstider uppnås i fallet med tillräckligt stora ingångar som kan få sorten att köra instabil.
Alternativ
--stabilAnvändande
sortera - stabilKommandorad
tid seq 1000000 | sortera - slumpmässig sortering | sort --stable> / dev / nullProduktion
verklig 0m9.138-taletanvändare 0m9.201-talet
sys 0m0.107-talet
Sortera buffertstorlek
Sortering har ett alternativ som låter dig ställa in mängden minne som används som buffert vid sortering. Den kan användas för att begränsa minnesförbrukningen genom att sortera större ingångar. Prestanda kan påverkas.
Alternativ
--buffertstorlek = STORLEKAnvändande
sortera - buffertstorlek = 64Kommandorad
tid seq 1000000 | sortera-slumpmässigt-sortera | sortera -stabil -buffer-size = 64> / dev / null
Produktion
verklig 0m21.685sanvändare 0m9.858s
sys 0m2.092s
Sortera unikt
Sortera har ett alternativ som låter dig ta bort dubbla rader i sorteringsutdata
Alternativ
--unikAnvändande
sortera - uniktKommandorad eko 1 2 2 4 5 | tr '\ 040' '\ 000' | sortera - nollavslutad - unik
Produktion
1245Alternativ
sortera | uniqSlutsats
Sortera är ett externt kommando som inte bara är användbart när det används i kombination med andra externa kommandon utan också användbart när det används med kommandon utan inbyggd beställningsmetod som en användardefinierad funktion eller bash-skript i allmänhet.