Con sort, puoi ordinare i file in base all'ordine nel dizionario o per valore numerico, randomizzare le righe dei file, rimuovere le righe duplicate e controllare se un file è ordinato.
Potresti essere in grado di fare altre cose con esso, ma prima, preoccupiamoci di avvolgere le nostre teste su come usare sort negli script bash.
Cos'è il tipo??
Sort è un comando esterno che concatena i file mentre ordina il loro contenuto in base a un tipo di ordinamento e scrive i risultati di ordinamento nell'output standard.
Ordina le opzioni del comando per bash
Il comando sort include 31 opzioni (13 principali e 18 classificate come altro). La programmazione bash più esperta (anche gli esperti) conosce solo alcune opzioni di ordinamento principali necessarie per cavarsela. Gli altri sono raramente toccati. Per tua fortuna abbiamo tempo per toccarli tutti.
Principali opzioni di ordinamento
Queste sono le opzioni che ti aiutano a fare le cose e a ordinare (Ordinamento) oltre a manipolare i risultati ordinati (Post-elaborazione) e ad applicare filtri (Filtri) prima dell'ordinamento.
Ordinamento
L'ordinamento viene fornito con 5 diversi tipi di ordinamento. Ecco una tabella che mostra ogni tipo di ordinamento con le opzioni associate.
Ordinare | Opzione corta/opzione lunga/ecc parola |
Ordinamento numerico (generale) | -g / -ordinamento-numerico-generale numerico-generale supporto per la notazione scientifica 0.1234e4 = 1234 |
Ordinamento numerico (umano) | -h / -ordinamento-numerico-umano umano-numerico 1.234K = 1234 |
Numerico | -n / -ordinamento-numerico numerico … < -1 < 0 < 1 <… |
Mese | -M / -mese-sort mese Sconosciuto < Jan < Feb <… < Nov < Dec |
Casuale | -r / -ordinamento-casuale casuale |
Versione | -V / -version-sort versione |
Nota che ogni tipo di ordinamento ha un'opzione lunga che termina con -sort. Oltre alle opzioni di ordinamento specifiche, è possibile utilizzare l'opzione -sort=WORD per ordinare per parola. Ad esempio -sort=random può essere usato al posto di -random-sort o -r.
Esempi
Ecco alcuni esempi di comandi di ordinamento per ciascun metodo di ordinamento.
Esempio) Ordinamento dei nomi
L'ordinamento non ha problemi a ordinare le righe in ordine alfabetico. Considera un elenco di personaggi famosi non ordinato.
Funzione
gente famosa()curl --silent https://www.biografia in linea.rete/persone/famoso-100.html
| grep post-content | sed -e 's/<[^>]*.//g' -e 's/WWII//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'
Riga di comando
personaggi famosi | ordinareProduzione
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)
Esempio) Ordinamento numerico generale
Se abbiamo bisogno di ordinare i valori numerici prendendo in considerazione la notazione scientifica come 99e2, possiamo usare l'ordinamento numerico generale.
Funzione
valori-numerici-non ordinati ()seq 100 | sort --ordinamento-casuale | sed '3i 9e2' | sed '3i 99K'
Considera l'output ordinato utilizzando ciascun metodo. Nota che oltre a contenere i valori da 1 a 100, l'elenco include anche '9e12' (900) e '99K' (99000).
Riga di comando
valori-numerici-non ordinati | sort -nProduzione
9697
98
99
99K
100
Che dire di 900 e 99000. Esatto, è solo un ordinamento numerico. Il prossimo.
Riga di comando
valori-numerici-non ordinati | sort -hProduzione
9697
98
99
100
99K
Che ne dici di 900. Esatto, è solo un ordinamento numerico umano. Il prossimo.
Riga di comando
valori-numerici-non ordinati | sort -gProduzione
9697
98
99
99K
100
9e2
Che ne dici di 99000. Esatto, è solo un ordinamento numerico generale. Come vedi nessun metodo di ordinamento è compatibile in questo caso; tuttavia, ciò non significa che non puoi trovare una soluzione.
Riga di comando
valori-numerici-non ordinati | sed 's/[kK]/e3/' | sort -gProduzione
9697
98
99
100
9e2
99e3
Ora è più così.
Esempio) Ordinamento numerico umano
Se abbiamo bisogno di ordinare i valori numerici prendendo in considerazione il significato di notazioni come K, G, M ed E, possiamo usare l'ordinamento numerico umano.
Riga di comando
seq 100 | sort --ordinamento-casuale | sed '3i 3k' | sort -hProduzione
9697
98
99
100
3k
Esempio) Ordinamento numerico
Se tutto ciò di cui abbiamo bisogno è ordinare i numeri interi, l'ordinamento numerico fa il trucco.
Riga di comando
seq 100 | sort --ordinamento-casuale | sort --numerics-sortProduzione
9596
97
98
99
100
Esempio) Ordinamento per mese
L'ordinamento per mese ti consente di ordinare le righe per mese. Potrebbe rivelarsi utile per raggruppare le righe per mese soprattutto nel caso in cui non sia disponibile l'opzione di ordinamento per orario.
Funzione
mesi ()gatto <
febbraio
Mar
aprile
Maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre
EOF
Supponiamo che i mesi non siano ordinati.
Riga di comando
mesi | sort --ordinamento-casualeProduzione
Marottobre
dicembre
aprile
Maggio
settembre
agosto
novembre
luglio
Jan
febbraio
giugno
Possiamo sempre ordinare per mese.
Riga di comando
mesi | sort --ordinamento-casuale | sort --month-sortProduzione
Janfebbraio
Mar
aprile
Maggio
giugno
luglio
agosto
settembre
ottobre
novembre
dicembre
Nota che se cambiamo Dec in qualsiasi sottostringa a novembre diciamo 'Novem', apparirà dopo 'Nov' nell'output ordinato.
Esempio) Ordinamento casuale: uccidi il terminale di qualcun altro
Come previsto, l'ordinamento casuale fa l'opposto dell'ordinamento, confonde le righe.
Supponiamo che per scopi educativi vogliamo uccidere un altro utente. Dovremmo assicurarci che non sia il nostro pty e randomizzare gli elenchi in modo che sia più bello e che possiamo dire che i pty sono stati selezionati a caso.
Comandi
messaggio-pty ()pty locale;
pty="$1"
;
echo -n "Stai andando giù" > /dev/$pty;
per i in 5 4 3 2 1;
fare
dormire 1;
echo -n " $i" > /dev/$pty;
fatto;
eco " Ciao By!" > /dev/$pty;
dormire 1
ps | grep pty | grep -v -e $( mypty ) | sort --ordinamento-casuale | head -1 > stdin;
messaggio-pty $( pty < stdin );
kill $( pid pi < stdin )
Uscita nel terminale di qualcun altro
Stai andando giù tra 5 4 3 2 1 Ciao!]
(Uscita)
Esempio) Ordinamento versione - ordinamento ips
Come sai, i file sorgente possono essere versionati usando stringhe come 1.0. Inoltre, le versioni possono andare più in profondità con numeri di versione come 1.0.0 come si vede nei popolari schemi di versione semantica.
L'ordinamento delle versioni ti consente di ordinare i numeri di versione. grande! ora cosa?? Mettiamolo alla prova.
Per questo esempio, ho preparato uno script bash per generare ips casuali in modo da non dover andare lì. È nel repo. Per quelli di noi che non hanno il repository, ecco un inizio veloce.
Comandi
git clone https://github.com/temptemp3/linuxhint.come.idiotaalias random-ips='test -f "linuxhint.com/genera-ips-casuali.sh" ; bash $_'
Ora che sei pronto iniziamo.
Riga di comando
ips casuali 200 | t-shirtProduzione
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
Ok, funziona. Ora vediamo cosa succede quando proviamo a ordinare ips.
Riga di comando
ordina ipsProduzione
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
A prima vista, sembra funzionare ma linee come 8.96.11.181 dovrebbe apparire altrove.
Comandi
per o in d h n V g M
fare
sort ips -$o > ips$o,,
fatto
echo tutti gli ordinamenti uguale ordinamento numerico
diff ipsn,d 1>/dev/null || eco dizionario ordine != ordinamento numerico
diff ipsn,h 1>/dev/null || echo ordinamento numerico umano != ordinamento numerico
diff ipsn,g 1>/dev/null || echo ordinamento numerico generale != ordinamento numerico
diff ipsn,v 1>/dev/null ||
echo version sort != ordinamento numerico
show_n_v_ips_diff="true"
test ! "$show_n_v_ips_diff" || diff ipsn,v
Produzione
tutti gli ordinamenti uguale ordinamento numericoordine del dizionario != ordinamento numerico
ordinamento versione != ordinamento numerico
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
Come vedi l'ordinamento delle versioni ti consente di ordinare i numeri di versione quando altri metodi di ordinamento falliscono.
Esempio) Ordinamento versione - ordinamento dei nomi dei file con i numeri di versione
Partendo dall'ultimo esempio, usiamo version sort un po' più vicino all'uso previsto. Come sai, i numeri di versione appaiono comunemente nei nomi dei file. Vedi i dettagli sull'ordinamento delle versioni.
Per prima cosa, trasformiamo ips in qualcos'altro di più file sorgente del progetto come.
Comandi
alfa()alpha="abcdefghijklmnopqrstuvwxyz";
echo -n $alpha:$(( RANDOM % 26 )):1
beta()
alfa="ab";
echo -n $alpha:$(( RANDOM % 2 )):1
gatto ips | while read -r riga; fare
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).catrame.gz;
fatto | sorsi di tee
Produzione
x-v56.16.109.54.catrame.gzk-v117.38.14.165a.catrame.gz
d-v87.59.32.91a.catrame.gz
h-v115.215.64.100.catrame.gz
s-v72.174.246.218b.catrame.gz
h-v163.93.19.173.catrame.gz
u-v184.225.11.92b.catrame.gz
y-v205.53.5.211a.catrame.gz
t-v175.196.164.17b.catrame.gz
e-v167.42.221.178b.catrame.gz
c-v126.54.190.189b.catrame.gz
b-v169.180.221.131a.catrame.gz
y-v210.125.170.231a.catrame.gz
x-v71.56.120.9b.catrame.gz
Esercizio
Rendi più veloci i comandi precedenti usando xargs
Vedi esempio in come usare il comando xargs negli script bash.
Questa volta, non ci preoccuperemo nemmeno di usare nessuno degli altri metodi di ordinamento.
Riga di comando
sort -V sorsiProduzione
d-v127.100.108.192.catrame.gze-v62.140.229.42a.catrame.gz
e-v149.77.211.215a.catrame.gz
e-v167.42.221.178b.catrame.gz
e-v194.189.236.29a.catrame.gz
e-v198.145.199.84b.catrame.gz
e-v240.1.147.196b.catrame.gz
f-v50.100.142.42b.catrame.gz
f-v117.58.230.116.catrame.gz
f-v139.17.210.68b.catrame.gz
f-v153.18.145.133b.catrame.gz
g-v201.153.203.60b.catrame.gz
g-v213.58.67.108.catrame.gz
h-v5.206.37.224.catrame.gz
Ora vedi che l'ordinamento della versione può essere utile quando si ordinano i nomi dei file con i numeri di versione.
Pre ordinamento
L'ordinamento ha quattro opzioni principali che influiscono sull'ordinamento effettivo, vale a dire -ignore-leading-blanks, -ignore-case, -ignore-nonprinting e -dictionary-order, che possono o meno sovrapporsi. Esempio di utilizzo di ciascuna opzione segue.
Ordina ignorando gli spazi iniziali
Ordina consente di ignorare gli spazi iniziali di input come opzione. Gli spazi iniziali vengono conservati nell'output ordinato.
Opzione
--ignora-spazi vuotiUtilizzo
sort --ignora gli spazi vuoti inizialiComandi
personaggi famosi > fpgatto >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)
EOF
gatto fp | ordina | tac
Produzione
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)
Nota che gli spazi iniziali nelle righe aggiunte a fp appaiono per primi nell'output di ordinamento.
Per risolvere questo problema dobbiamo ignorare gli spazi vuoti iniziali come segue.
Comandi
personaggi famosi > fpgatto >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abramo Lincoln (1809 - 1865)
EOF
gatto fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac
Produzione
Marilyn Monroe (1926 - 1962)Marilyn Monroe (1926 - 1962)
Maria Antonietta (1755 - 1793)
…
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abramo Lincoln (1809 - 1865)
alternative
gatto fp | sed 's/^\s*//' | ordina | tacNota che l'alternativa non conserva gli spazi iniziali nell'ordinamento dell'output.
Ordina ignorando il caso
Ordina consente di ignorare il caso di input come opzione. Il caso è conservato nell'output ordinato.
Opzione
--ignora-casoUtilizzo
sort --ignore-caseComandi
personaggi famosi > fpgatto >> fp << EOF
abramo Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gatto fp | ordina | tac
Produzione
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Nota che gli spazi iniziali nelle righe aggiunte a fp appaiono per primi nell'output di ordinamento.
Per risolvere questo problema dobbiamo ignorare gli spazi vuoti iniziali come segue.
Comandi
personaggi famosi > fpgatto >> fp << EOF
abramo Lincoln (1809 - 1865)
ABraham Lincoln (1809 - 1865)
EOF
gatto fp | sort --ignore-case | tac
Produzione
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
abramo Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
alternative
gatto fp | while read -r riga ; do echo $linea,, ; fatto | ordina | tacNota che l'alternativa non conserva maiuscole e minuscole nell'output di ordinamento.
Ordina ignorando non stampabile
Ordina consente di ignorare l'input non stampabile come opzione. La non stampa viene conservata nell'output ordinato.
Opzione
--ignora-non stampabileUtilizzo
sort --ignore-non stampabileComandi
personaggi famosi > fpecho -e "\x90Abe" >> fp
gatto fp | ordina | tac
Produzione
Audrey Hepburn (1929 - 1993)Angelina Jolie (1975 - )
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Sembra che ci manchi un "Abe" per i caratteri non stampabili nell'input di ordinamento.
Per risolvere questo problema dobbiamo ignorare i caratteri non stampabili.
Comandi
personaggi famosi > fpecho -e "\x90Abe" >> fp
gatto fp | sort --ignore-non stampabile | tac
[/cc\
Produzione
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
Abe
Ordina l'ordine del dizionario
Ordina consente di ignorare tutti gli input tranne gli spazi e i caratteri alfanumerici come opzione. L'input è conservato nell'output ordinato.
personaggi famosi > fpecho -e "\x90Abe" >> fp
gatto fp | sort --d | tac
Ordina post
L'ordinamento ha un'opzione principale che non influisce sull'ordinamento, ovvero -reverse. Tuttavia, influisce sull'output, consentendo di alternare l'ordine tra ascendente e discendente. Segue un esempio.
Ordina output inverso
Ordina consente di visualizzare l'output in ordine inverso come opzione.
Opzione
--inversioneUtilizzo
ordina --reverseRiga di comando
personaggi famosi | ordina --reverseProduzione
Angelina Jolie (1975 - )Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abramo Lincoln (1809 - 1865)
alternative
ordina | tacAltre opzioni per l'ordinamento
Ci sono altre ventidue opzioni per l'ordinamento. Seguono esempi.
Ordina controllo
Ordina ha un'opzione che ti permette di controllare se l'input è ordinato. Ritorna dopo la prima istanza di una riga non ordinata. Nel caso in cui sia necessario ordinare l'input ma è probabile che sia già in ordine, l'uso del controllo di ordinamento è appropriato.
Opzione
--dai un'occhiataUtilizzo
sort --checkRiga di comando
seq 10 | sort --ordinamento-casuale | sort --checkProduzione
sort: -:3: disordine: 10Riga di comando
seq 10 | sort --ordinamento-casuale | ordina | sort --checkProduzione
(vuoto)Ordina output
L'ordinamento ha un'opzione che ti consente di specificare un file su cui scrivere invece di utilizzare l'output standard o il reindirizzamento. Il suo utilizzo può migliorare la compatibilità tra ambienti di scripting.
Opzione
--output=FILEUtilizzo
sort --output=FILERiga di comando
seq 10 | sort --random-sort --output=random-10Produzione
(vuoto)Ordina null terminato
Ordina ha un'opzione che ti consente di impostare il delimitatore di riga su null invece di una nuova riga.
Opzione
--zero-terminatoUtilizzo
sort --zero-terminatedRiga di comando
seq 10 | tr '\012' '\000' | sort --zero-terminated --random-sortProduzione
25346178910Ordina stabile
L'ordinamento ha un'opzione che ti consente di disabilitare il confronto dell'ultima risorsa. Di conseguenza, è possibile ottenere tempi di esecuzione più stabili nel caso di input sufficientemente grandi da causare l'instabilità dell'ordinamento.
Opzione
--stabileUtilizzo
ordina --stabileRiga di comando
sequenza temporale 1000000 | sort --ordinamento-casuale | sort --stable >/dev/nullProduzione
reale 0m9.138sutente 0m9.201 secondi
sis 0m0.107s
Ordina le dimensioni del buffer
Ordina ha un'opzione che ti consente di impostare la quantità di memoria utilizzata come buffer durante l'ordinamento. Può essere utilizzato per limitare il consumo di memoria ordinando input più grandi. Le prestazioni potrebbero risentirne.
Opzione
--buffer-size=SIZEUtilizzo
sort --buffer-size=64Riga di comando
sequenza temporale 1000000 | sort -random-sort | sort -stable -buffer-size=64 >/dev/null
Produzione
reale 0m21.685 secondiutente 0m9.858 secondi
sistema 0m2.092s
Ordina unico
Ordina ha un'opzione che ti consente di rimuovere le righe duplicate nell'output di ordinamento
Opzione
--unicoUtilizzo
sort --unicoRiga di comando eco 1 2 2 4 5 | tr '\040' '\000' | sort --zero-terminated --unique
Produzione
1245alternative
ordina | unicoConclusione
Sortèun comando esterno utile non solo se usato in combinazione con altri comandi esterni ma è utile anche se usato con comandi senza un metodo di ordinamento integrato come una funzione definita dall'utente o script bash in generale.