Izmantojot kārtošanu, jūs varat pasūtīt failus, pamatojoties uz secību vārdnīcā vai pēc skaitliskās vērtības, randomizēt failu rindas, noņemt rindu dublikātus un pārbaudīt, vai fails ir sakārtots.
Jūs, iespējams, varēsit darīt citas lietas, taču vispirms uztraucīsimies par to, kā aplauzt galvu par to, kā izmantot kārtošanu bash skriptos.
Kas ir kārtot?
Kārtot ir ārēja komanda, kas savieno failus, vienlaikus sakārtojot to saturu pēc kārtošanas veida un uzrakstot kārtošanas rezultātus standarta izvadē.
Kārtot komandu opcijas bash
Kārtošanas komandai ir 31 opcija (13 galvenās un 18 klasificētas kā citas). Visvairāk pieredzējušie bash programmētāji (pat eksperti) zina tikai dažas galvenās kārtošanas iespējas, kas nepieciešamas, lai tiktu galā. Citiem reti pieskaras. Jums paveicies, mums ir laiks pieskarties viņiem visiem.
Galvenās kārtošanas iespējas
Šīs ir iespējas, kas palīdz jums veikt lietas un kārtot (šķirošana) papildus manipulēšanai ar kārtotajiem rezultātiem (pēcapstrāde) un filtru lietošanu (filtri) pirms šķirošanas.
Šķirošana
Kārtot nāk ar 5 dažādiem šķirošanas veidiem. Šeit ir tabula, kurā parādīts katrs šķirošanas veids ar saistītajām opcijām.
Kārtot | Īss variants / garš variants / utt vārdu |
Ciparu kārtošana (vispārīgi) | -g / -vispārīgi-skaitliski-kārtot vispārīgi-ciparu atbalsts zinātniskajam pierakstam 0.1234e4 = 1234 |
Ciparu kārtošana (cilvēka) | -h / -cilvēka-ciparu-kārtošana cilvēks-cipars 1.234K = 1234 |
Ciparu skaitlis | -n / -ciparu šķirošana ciparu … < -1 < 0 < 1 <… |
Mēnesis | -M / mēnesis-kārtot mēnesī Nezināms < Jan < Feb <… < Nov < Dec |
Nejaušs | -r / -pastāvīgi-kārtot nejaušs |
Versija | -V / -versijas šķirošana versija |
Ņemiet vērā, ka katram šķirošanas veidam ir gara opcija, kas beidzas ar -sort. Papildus īpašām šķirošanas opcijām šķirošanai pēc vārda var izmantot opciju -sort = WORD. Piemēram, -random-sort vai -r vietā var izmantot -sort = random.
Piemēri
Šeit ir daži šķirošanas komandu piemēri katrai šķirošanas metodei.
Piemērs) Vārdu kārtošana
Kārtot nav problēmu, kārtojot līnijas alfabētiskā secībā. Apsveriet slavenu cilvēku sarakstu, kas nav sakārtots.
Funkcija
slaveni cilvēki()čokurošanās - kluss https: // www.biogrāfija tiešsaistē.net / cilvēki / slavens-100.html
| grep post-content | sed-es /<[^>] *.// g '-e' s / II pasaules karš // g '-e' s / \ (Wilbur \)
/ \ 1 Wright / '| grep -o -e '\ (\ ([A-Z] \ + [.] \?\) \ + [a-z] * \ s \) \ + ([0-9] \ + \ s [^)] \+."
Komandrinda
slaveni cilvēki | kārtotRezultāts
Stīvens Kings (1947 -)Stīvs Džobs (1955 - 2012)
Stings (1951 -)
Taigers Vuds (1975 -)
Toms Krūzs (1962 -)
Usēns Bolts (1986 -)
Vinci (1452 - 1519)
Volts Disnejs (1901 - 1966)
Vilburs Raits (1867 - 1912)
Vudrovs Vilsons (1856 - 1924)
Piemērs) Vispārēja skaitliskā kārtošana
Ja mums ir jāšķiro skaitliskās vērtības, faktiski ņemot vērā zinātniskos apzīmējumus, piemēram, 99e2, mēs varam izmantot vispārīgu skaitlisko šķirošanu.
Funkcija
nešķirotas-skaitliskas vērtības ()sek 100 | kārtot - nejauši-kārtot | sed '3i 9e2' | sed '3i 99K'
Apsveriet sakārtoto izvadi, izmantojot katru metodi. Ņemiet vērā, ka papildus vērtībām no 1 līdz 100 tajā ir iekļauti arī “9e12” (900) un “99K” (99000).
Komandrinda
nešķirotas-skaitliskas vērtības | kārtot -nRezultāts
9697
98
99
99K
100
Kas par 900 un 99000. Pareizi, tā ir tikai skaitliskā kārtošana. Nākamais.
Komandrinda
nešķirotas-skaitliskas vērtības | kārtot -hRezultāts
9697
98
99
100
99K
Kas par 900. Pareizi, tas ir tikai cilvēku skaitliskais sakārtojums. Nākamais.
Komandrinda
nešķirotas-skaitliskas vērtības | kārtot -gRezultāts
9697
98
99
99K
100
9e2
Kas par 99000. Pareizi, tas ir tikai vispārīgs ciparu kārtojums. Kā redzat, neviena šķirošanas metode šajā gadījumā nav saderīga; tomēr tas nenozīmē, ka jūs nevarat nākt klajā ar labojumu.
Komandrinda
nešķirotas-skaitliskas vērtības | sed 's / [kK] / e3 /' | kārtot -gRezultāts
9697
98
99
100
9e2
99e3
Tagad tas vairāk līdzinās.
Piemērs) Cilvēka skaitliskā kārtošana
Ja mums ir jāšķiro skaitliskās vērtības, faktiski ņemot vērā tādu apzīmējumu nozīmi kā K, G, M un E, mēs varam izmantot cilvēku skaitlisko kārtošanu.
Komandrinda
sek 100 | kārtot - nejauši-kārtot | sed '3i 3k' | kārtot -hRezultāts
9697
98
99
100
3k
Piemērs) Ciparu kārtošana
Ja viss, kas mums nepieciešams, ir veselu skaitļu kārtošana, skaitliskā kārtošana ir triks.
Komandrinda
sek 100 | kārtot - nejauši-kārtot | kārtot - cipari-kārtotRezultāts
9596
97
98
99
100
Piemērs) Mēneša kārtošana
Mēneša kārtošana ļauj pasūtīt rindas pēc mēneša. Tas varētu izrādīties noderīgs rindu grupēšanai pa mēnešiem, īpaši gadījumā, ja nav pieejama šķirošanas iespēja pēc laika.
Funkcija
mēneši ()kaķis <
Februāris
Marts
Apr
Maijs
Jūnijs
Jūl
Aug
Sept
Okt
Nov
Dec
EOF
Pieņemsim, ka mēneši netiek šķiroti.
Komandrinda
mēneši | kārtot - nejauši-kārtotRezultāts
MartsOkt
Dec
Apr
Maijs
Sept
Aug
Nov
Jūl
Jan
Februāris
Jūnijs
Mēs vienmēr varam kārtot pēc mēnešiem.
Komandrinda
mēneši | kārtot - nejauši-kārtot | kārtot - mēnesi-kārtotRezultāts
JanFebruāris
Marts
Apr
Maijs
Jūnijs
Jūl
Aug
Sept
Okt
Nov
Dec
Ņemiet vērā, ka, ja novembrī decembri mainīsim uz jebkuru apakšvirsrakstu, sakot “Novem”, tas sakārtotajā izvadā parādīsies pēc “Nov”.
Piemērs) Nejauša kārtošana - nogaliniet kāda cita termināli
Kā paredzēts, nejauša kārtošana notiek pretēji šķirošanai, sajauc rindas.
Pieņemsim, ka izglītības nolūkos mēs vēlamies nogalināt citu lietotāju. Mums būtu jāpārliecinās, ka tas nav mūsu pty, un nejauši izvēlieties sarakstus tā, lai tas būtu jaukāks un mēs varētu teikt, ka ptys tika izvēlēti nejauši.
Komandas
ziņa-pty ()vietējais pty;
pty = "$ 1"
;
echo -n "Jūs ejat lejup"> / dev / $ pty;
i i 5 4 3 2 1;
darīt
gulēt 1;
atbalss -n "$ i"> / dev / $ pty;
izdarīts;
atbalss "Uz redzēšanos!"> / dev / $ pty;
gulēt 1
ps | grep pty | grep -v -e $ (mypty) | kārtot - nejauši-kārtot | galva -1> stdin;
ziņa-pty $ (pty < stdin );
nogalināt $ (pid < stdin )
Izeja kāda cita terminālā
Jūs ejat lejā pēc 5 4 3 2 1 uz redzēšanos!]
(Izeja)
Piemērs) Versijas kārtošana - ips šķirošana
Kā jūs zināt, avota faili var būt versijoti, izmantojot virknes, piemēram, 1.0. Turklāt versijas var iedziļināties ar tādu versiju numuriem kā 1.0.0, piemēram, redzams populārās semantisko versiju shēmās.
Versiju kārtošana ļauj kārtot versiju numurus. Lieliski! Ko tagad? Pārbaudīsim.
Šajā piemērā es esmu sagatavojis bash skriptu, lai ģenerētu nejaušas ips, lai mums nebūtu jādodas uz turieni. Tas ir repo. Tiem no mums, kuriem nav repo, šeit ir ātrs sākums.
Komandas
git klons https: // github.com / temptemp3 / linuxhint.com.gitpseidonīms random-ips = 'test -f "linuxhint.com / generator-random-ips.sh "; bash $ _ '
Tagad, kad esat gatavs, sāksim.
Komandrinda
izlases ips 200 | tee ipsRezultāts
199.174. lpp.177. lpp.98180.33.247.107
87.130.125.109
76.86.8.20
162.41.183.150
226.58.10.196
83.121.11.145. lpp
80.199.197.19
44.214.89.52
185.174. lpp.143.111
Labi, tas darbojas. Tagad redzēsim, kas notiek, mēģinot kārtot ips.
Komandrinda
kārtot ipsRezultāts
76.88.194.157. lpp8.96.11.181
82.169. lpp.213.206. lpp
84.218.132.51
84.3.101.97
87.137.131.40
87.59.32.91
89.149. lpp.111.242
97.121.162.244
98.145. lpp.130.186
No pirmā acu uzmetiena šķiet, ka tas darbojas, bet tādas līnijas kā 8.96.11.181 vajadzētu parādīties citur.
Komandas
par o in d h n V g M
darīt
kārtot ips - $ o> ips $ o ,,
izdarīts
atbalss visu veidu vienādi skaitliski
diff ips n, d 1> / dev / null || atbalss vārdnīcas secība != skaitliskā kārtošana
diff ips n, h 1> / dev / null || atbalss cilvēka skaitliskā kārtošana != skaitliskā kārtošana
diff ips n, g 1> / dev / null || atbalss vispārējā skaitliskā kārtošana != skaitliskā kārtošana
diff ips n, v 1> / dev / null ||
atbalss versiju kārtošana != skaitliskā kārtošana
show_n_v_ips_diff = "true"
pārbaude ! "$ show_n_v_ips_diff" || diff ips n, v
Rezultāts
visu veidu vienādi skaitliskivārdnīcas secība != skaitliskā kārtošana
versiju kārtošana != skaitliskā kārtošana
13,14d12
< 44.221.43.20
< 44.27.108.172
15a14,15
> 44.27.108. lpp.172
> 44.221.43.20
27d26
< 84.218.132.51
29c28
< 87.137.131.40
Kā redzat, versiju kārtošana ļauj kārtot versiju numurus, ja citas šķirošanas metodes neizdodas.
Piemērs) Version sort - failu nosaukumu šķirošana ar versiju numuriem
Balstoties uz pēdējo piemēru, izmantosim versiju kārtošanu nedaudz tuvāk paredzētajam lietojumam. Kā jūs zināt, versiju numuri parasti parādās failu nosaukumos. Skatiet Sīkāka informācija par versiju kārtošanu.
Pirmkārt, pārveidosim ips par kaut ko citu projekta avota failu, piemēram,.
Komandas
alfa ()alfa = "abcdefghijklmnopqrstuvwxyz";
echo -n $ alpha: $ ((RANDOM% 26)): 1
beta ()
alfa = "ab";
echo -n $ alpha: $ ((RANDOM% 2)): 1
kaķu ips | lasot -r rindiņu; darīt
echo $ (alfa) -v $ line $ (tests $ ((RANDOM% 5)) -eq 0 || beta).darva.gz;
izdarīts | tee malks
Rezultāts
x-v56.16.109.54. lpp.darva.gzk-v117.38.14.165a.darva.gz
d-v87.59.32.91.a.darva.gz
h-v115.215.64.100.darva.gz
s-v72.174. lpp.246. lpp.218.b.darva.gz
h-v163.93.19.173.darva.gz
u-v184.225.11.92b.darva.gz
y-v205.53.5.211.a.darva.gz
t-v175.196.164. lpp.17.b.darva.gz
e-v167.42.221.178b.darva.gz
c-v126.54. lpp.190.189.b.darva.gz
b-v169.180.221.131.a.darva.gz
y-v210.125.170.231a.darva.gz
x-v71.56.120.9.b.darva.gz
Vingrojiet
Ļaujiet iepriekš minētajām komandām darboties ātrāk, izmantojot xargs
Skatiet piemēru, kā izmantot komandu xargs bash skriptos.
Šoreiz mēs pat netraucēsim izmantot citas šķirošanas metodes.
Komandrinda
kārtot -V malksRezultāts
d-v127.100.108. lpp.192.darva.gze-v62.140.229.42a.darva.gz
e-v149.77.211.215a.darva.gz
e-v167.42.221.178b.darva.gz
e-v194.189.236. lpp.29.a.darva.gz
e-v198.145. lpp.199.84.b.darva.gz
e-v240.1.147. lpp.196b.darva.gz
f-v50.100.142.42b.darva.gz
f-v117.58.230.116.darva.gz
f-v139.17.210.68b.darva.gz
f-v153.18.145. lpp.133b.darva.gz
g-v201.153.203.60b.darva.gz
g-v213.58.67.108. lpp.darva.gz
h-v5.206. lpp.37.224.darva.gz
Tagad jūs redzat, ka versiju kārtošana var būt noderīga, kārtojot failu nosaukumus ar versiju numuriem.
Iepriekš kārtot
Kārtot ir četras galvenās iespējas, kas ietekmē faktisko kārtošanu, proti, -ignore-lead-blanks, -ignore-case, -ignore-nonprinting un -dictionary-order, kas var pārklāties, bet var arī nebūt. Sekojiet katras opcijas izmantošanai.
Kārtojiet, ignorējot galvenās sagataves
Kārtot ļauj ignorēt ievades vadošās tukšās vietas kā opciju. Kārtotajā izvadā tiek saglabātas vadošās sagataves.
Opcija
--ignorēt sagatavesLietošana
šķirot - tukšie priekšrakstiKomandas
slaveni cilvēki> fpkaķis >> fp << EOF
Merilina Monro (1926 - 1962)
Ābrahams Linkolns (1809 - 1865)
EOF
kaķu fp | kārtot | tac
Rezultāts
Alfrēds Hičkoks (1899 - 1980)Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Merilina Monro (1926 - 1962)
Ābrahams Linkolns (1809 - 1865)
Ņemiet vērā, ka rindas, kas pievienotas fp, vadošās atstarpes vispirms tiek rādītas kārtošanas izvade.
Lai to novērstu, mums jāignorē galvenie sagataves šādi.
Komandas
slaveni cilvēki> fpkaķis >> fp << EOF
Merilina Monro (1926 - 1962)
Ābrahams Linkolns (1809 - 1865)
EOF
kaķu fp | kārtot --ignorē-vadošie-tukšie --ignignor-vadošie-sagataves | tac
Rezultāts
Merilina Monro (1926 - 1962)Merilina Monro (1926 - 1962)
Marija Antuanete (1755 - 1793)
…
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Ābrahams Linkolns (1809 - 1865)
Alternatīvas
kaķu fp | sed 's / ^ \ s * //' | kārtot | tacŅemiet vērā, ka alternatīva nesaglabā galvenās sagataves kārtošanas izvadā.
Kārtot, ignorējot reģistru
Kārtot ļauj ievades reģistrus ignorēt kā opciju. Lieta tiek saglabāta sakārtotajā izvadā.
Opcija
--ignore-caseLietošana
kārtot --ignore-caseKomandas
slaveni cilvēki> fpkaķis >> fp << EOF
Ābrahams Linkolns (1809 - 1865)
ABrahams Linkolns (1809 - 1865)
EOF
kaķu fp | kārtot | tac
Rezultāts
Amēlija Earhart (1897 - 1937)Alfrēds Hičkoks (1899 - 1980)
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
ABrahams Linkolns (1809 - 1865)
Ņemiet vērā, ka rindas, kas pievienotas fp, vadošās atstarpes vispirms tiek rādītas kārtošanas izvadā.
Lai to novērstu, mums ir jāignorē galvenie sagataves šādi.
Komandas
slaveni cilvēki> fpkaķis >> fp << EOF
Ābrahams Linkolns (1809 - 1865)
ABrahams Linkolns (1809 - 1865)
EOF
kaķu fp | kārtot --ignore-case | tac
Rezultāts
Amēlija Earhart (1897 - 1937)Alfrēds Hičkoks (1899 - 1980)
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Ābrahams Linkolns (1809 - 1865)
ABrahams Linkolns (1809 - 1865)
Alternatīvas
kaķu fp | lasot -r rindiņu; do echo $ line ,,; izdarīts | kārtot | tacŅemiet vērā, ka alternatīva neļauj saglabāt reģistru šķirošanas izvadā.
Kārtot, ignorējot nedrukāšanu
Kārtot ļauj ignorēt ievades neizdruku kā opciju. Kārtotajā izvadā tiek saglabāta izdrukāšana.
Opcija
--ignorēt-neizdrukātLietošana
kārtot --ignore-nonprintingKomandas
slaveni cilvēki> fpatbalss -e "\ x90Abe" >> fp
kaķu fp | kārtot | tac
Rezultāts
Odrija Hepberna (1929 - 1993)Andželīna Džolija (1975 -)
Amēlija Earhart (1897 - 1937)
Alfrēds Hičkoks (1899 - 1980)
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Šķiet, ka mums trūkst “Abe” darījuma, lai kārtojuma ievades rakstzīmes netiktu drukātas.
Lai to labotu, mums jāignorē rakstzīmes, kas netiek drukātas.
Komandas
slaveni cilvēki> fpatbalss -e "\ x90Abe" >> fp
kaķu fp | kārtot --ignore-nonprinting | tac
[/ cc \
Rezultāts
[cc lang = "bash"]
Amēlija Earhart (1897 - 1937)
Alfrēds Hičkoks (1899 - 1980)
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Abe
Kārtot vārdnīcas secību
Kārtot ļauj ignorēt visu ievadi, izņemot atstarpes un burtciparu rakstzīmes kā opciju. Ievade tiek saglabāta sakārtotajā izvadā.
slaveni cilvēki> fpatbalss -e "\ x90Abe" >> fp
kaķu fp | kārtot --d | tac
Ziņu kārtošana
Kārtot ir viena galvenā opcija, kas neietekmē šķirošanu, proti, -reverse. Tomēr tas ietekmē izvadi, ļaujot pārslēgt secību starp augšupejošu un dilstošu. Seko piemērs.
Kārtot reverso izvadi
Kārtot ļauj izvades parādīšanu apgrieztā secībā kā opciju.
Opcija
--reverssLietošana
kārtot - reverssKomandrinda
slaveni cilvēki | kārtot - reverssRezultāts
Andželīna Džolija (1975 -)Amēlija Earhart (1897 - 1937)
Alfrēds Hičkoks (1899 - 1980)
Alberts Einšteins (1879 - 1955)
Als Gors (1948 -)
Ābrahams Linkolns (1809 - 1865)
Alternatīvas
kārtot | tacCitas šķirošanas iespējas
Kārtošanai ir vēl divdesmit divas iespējas. Tālāk seko piemēri.
Kārtot pārbaudi
Kārtot ir opcija, kas ļauj pārbaudīt, vai ievade ir sakārtota. Tas atgriežas pēc nešķirotās rindas pirmās instances. Gadījumā, ja ievade ir jāšķiro, bet, visticamāk, tā jau ir kārtībā, ir piemērota šķirošanas pārbaude.
Opcija
--pārbaudītLietošana
kārtot - pārbaudītKomandrinda
10. sek kārtot - nejauši-kārtot | kārtot - pārbaudītRezultāts
kārtot: -: 3: traucējumi: 10Komandrinda
10. sek kārtot - nejauši-kārtot | kārtot | kārtot - pārbaudītRezultāts
(tukšs)Kārtot izvadi
Kārtot ir opcija, kas ļauj norādīt failu, uz kuru rakstīt, nevis izmantot standarta izvadi vai novirzīšanu. Tās izmantošana var uzlabot saderību starp skriptu vidēm.
Opcija
--izeja = FILELietošana
kārtot - izeja = FILEKomandrinda
10. sek kārtot - nejauši-kārtot - izeja = nejaušs-10Rezultāts
(tukšs)Kārtot nulli ir pārtraukts
Kārtot ir opcija, kas ļauj līnijas atdalītāju iestatīt uz nulli, nevis jaunu līniju.
Opcija
--nulle izbeigtaLietošana
kārtot - nulle izbeigtaKomandrinda
10. sek tr '\ 012' '\ 000' | kārtot - ar nulli izbeigts - nejauši kārtotRezultāts
25346178910Kārtot stabili
Kārtot ir opcija, kas ļauj atspējot pēdējās iespējas salīdzināšanu. Rezultātā stabilāku izpildlaiku var sasniegt pietiekami lielu ieeju gadījumā, kas var izraisīt nestabilu skriešanu.
Opcija
--stabilsLietošana
kārtot - stabilsKomandrinda
laika secība 1000000 | kārtot - nejauši-kārtot | kārtot --stabils> / dev / nullRezultāts
reāls 0m9.138. gadilietotājs 0m9.201. gadi
sys 0m0.107. gadi
Kārtot bufera izmēru
Kārtot ir opcija, kas ļauj iestatīt atmiņas apjomu, kas tiek izmantots kā buferis šķirošanas laikā. To var izmantot, lai ierobežotu atmiņas patēriņu, kārtojot lielākas ievades. Var tikt ietekmēta veiktspēja.
Opcija
--bufera izmērs = SIZELietošana
kārtot - bufera izmērs = 64Komandrinda
laika secība 1000000 | kārtot-nejauši-kārtot | sort -stable -buffer-size = 64> / dev / null
Rezultāts
reālā 0m21.685. gadilietotājs 0m9.858. gadi
sys 0m2.092. gadi
Kārtot unikāli
Kārtot ir opcija, kas ļauj noņemt rindu dublikātus kārtošanas izvadā
Opcija
--unikālsLietošana
kārtot - unikālsKomandrinda atbalss 1 2 2 4 5 | tr '\ 040' '\ 000' | kārtot - nulle izbeigta - unikāla
Rezultāts
1245. gadsAlternatīvas
kārtot | unikālsSecinājums
Kārtot ir ārēja komanda, kas ir noderīga ne tikai tad, ja to lieto kopā ar citām ārējām komandām, bet arī ir noderīga, ja to lieto kopā ar komandām bez iebūvētas pasūtīšanas metodes, piemēram, lietotāja definēta funkcija vai bash skripti kopumā.