Dengan pengurutan, Anda dapat mengurutkan file berdasarkan urutan dalam kamus atau nilai numerik, mengacak baris file, menghapus baris duplikat, dan memeriksa apakah file diurutkan.
Anda mungkin dapat melakukan hal-hal lain dengannya, tetapi pertama-tama, mari kita khawatir tentang cara menggunakan sort dalam skrip bash.
Apa itu sort??
Sort adalah perintah eksternal yang menggabungkan file sambil menyortir kontennya menurut jenis sortir dan menulis hasil sortir ke output standar.
Urutkan opsi perintah untuk bash
Perintah sortir hadir dengan 31 opsi (13 utama dan 18 dikategorikan sebagai lainnya). Pemrograman bash yang paling berpengalaman (bahkan para ahli) hanya mengetahui beberapa opsi pengurutan utama yang diperlukan untuk bertahan. Yang lain jarang disentuh. Beruntung bagi Anda, kami punya waktu untuk menyentuh mereka semua.
Opsi pengurutan utama
Ini adalah opsi yang membantu Anda menyelesaikan dan mengurutkan (Penyortiran) selain memanipulasi hasil yang diurutkan (Pemrosesan pasca) dan menerapkan filter (Filter) sebelum menyortir.
Penyortiran
Sortir dilengkapi dengan 5 jenis penyortiran yang berbeda. Berikut adalah tabel yang menunjukkan setiap jenis pengurutan dengan opsi terkait.
Menyortir | Opsi pendek / opsi panjang / dll kata |
Sortir numerik (umum) | -g / -urutan-numerik-umum umum-numerik dukungan untuk notasi ilmiah 0.1234e4 = 1234 |
Sortir numerik (manusia) | -h / -pengurutan-numerik-manusia manusia-numerik 1.234K = 1234 |
numerik | -n / -urutan numerik numerik … < -1 < 0 < 1 <… |
Bulan | -M / -urutan bulan bulan Tidak diketahui < Jan < Feb <… < Nov < Dec |
Acak | -r / -pengurutan acak acak |
Versi: kapan | -V / -versi-sort Versi: kapan |
Perhatikan bahwa setiap jenis pengurutan memiliki opsi panjang yang diakhiri dengan -sort. Selain opsi pengurutan tertentu, opsi -sort=WORD dapat digunakan untuk mengurutkan berdasarkan kata. Misalnya -sort=random dapat digunakan sebagai pengganti -random-sort atau -r.
Contoh
Berikut adalah beberapa contoh perintah pengurutan untuk setiap metode pengurutan.
Contoh) Mengurutkan nama
Sortir tidak memiliki masalah menyortir baris menurut abjad. Pertimbangkan daftar orang terkenal yang tidak diurutkan.
Fungsi
orang terkenal()curl --diam https://www.biografi online.bersih/orang/terkenal-100.html
| grep post-konten | sed -e 's/<[^>]*.//g' -e 's/Perang Dunia II//g' -e 's/\(Wilbur\)
/\1 Wright/'| grep -o -e '\(\([A-Z]\+[.]\?\)\+[a-z]*\s\)\+([0-9]\+\s[^)]\+.'
Garis komando
orang terkenal | menyortirKeluaran
Stephen King (1947 - )Steve Jobs (1955 - 2012)
Sengatan (1951 - )
Hutan Harimau (1975 - )
Tom Cruise (1962 - )
Usain Bolt (1986 - )
Vinci (1452 - 1519)
Walt Disney (1901 - 1966)
Wilbur Wright (1867 - 1912)
Woodrow Wilson (1856 - 1924)
Contoh) Pengurutan numerik umum
Jika kita perlu mengurutkan nilai numerik dengan notasi ilmiah fakta seperti 99e2, kita dapat menggunakan pengurutan numerik umum.
Fungsi
nilai-numerik-tidak diurutkan ()barisan 100 | urutkan --pengurutan acak | sed '3i 9e2' | sed '3i 99K'
Pertimbangkan output yang diurutkan menggunakan setiap metode. Perhatikan bahwa selain berisi nilai 1 hingga 100, daftar juga menyertakan '9e12' (900) dan '99K' (99000).
Garis komando
nilai-numerik yang tidak diurutkan | urutkan -nKeluaran
9697
98
99
99K
100
Bagaimana dengan 900 dan 99000. Itu benar itu hanya pengurutan numerik. Lanjut.
Garis komando
nilai-numerik yang tidak diurutkan | urutkan -hKeluaran
9697
98
99
100
99K
Bagaimana dengan 900. Itu benar itu hanya jenis numerik manusia numer. Lanjut.
Garis komando
nilai-numerik yang tidak diurutkan | urutkan -gKeluaran
9697
98
99
99K
100
9e2
Bagaimana dengan 99000. Itu benar itu hanya pengurutan numerik umum. Seperti yang Anda lihat, tidak ada metode penyortiran yang kompatibel dalam kasus ini; namun, itu tidak berarti Anda tidak dapat menemukan solusi.
Garis komando
nilai-numerik yang tidak diurutkan | sed 's/[kK]/e3/' | urutkan -gKeluaran
9697
98
99
100
9e2
99e3
Sekarang lebih seperti itu.
Contoh) Pengurutan numerik manusia
Jika kita perlu mengurutkan nilai numerik dengan memperhatikan arti notasi seperti K, G, M, dan E, kita dapat menggunakan pengurutan numerik manusia.
Garis komando
barisan 100 | urutkan --pengurutan acak | sed '3i 3k' | urutkan -hKeluaran
9697
98
99
100
3k
Contoh) Pengurutan numerik
Jika yang kita butuhkan hanyalah mengurutkan bilangan bulat, pengurutan numerik berhasil does.
Garis komando
barisan 100 | urutkan --pengurutan acak | sort --numerics-sortKeluaran
9596
97
98
99
100
Contoh) Jenis bulan
Pengurutan bulan memungkinkan Anda untuk memesan baris berdasarkan bulan. Ini terbukti berguna untuk mengelompokkan baris berdasarkan bulan terutama jika opsi pengurutan berdasarkan waktu tidak tersedia.
Fungsi
bulan ()kucing <
Februari
Merusak
April
Mungkin
Juni
Juli
Agustus
Sep
Oktober
November
Desember
EOF
Misalkan bulan tidak diurutkan.
Garis komando
bulan | urutkan --pengurutan acakKeluaran
MerusakOktober
Desember
April
Mungkin
Sep
Agustus
November
Juli
Jan
Februari
Juni
Kami selalu dapat mengurutkan berdasarkan bulan.
Garis komando
bulan | urutkan --pengurutan acak | urutkan --urutkan bulanKeluaran
JanFebruari
Merusak
April
Mungkin
Juni
Juli
Agustus
Sep
Oktober
November
Desember
Perhatikan bahwa jika kita mengubah Des ke substring apa pun di bulan November, katakan 'Novem', itu akan muncul setelah 'Nov' dalam output yang diurutkan.
Contoh) Sortir acak - bunuh terminal orang lain
Seperti yang diharapkan, pengurutan acak melakukan kebalikan dari penyortiran, mencampuradukkan garis.
Misalkan untuk tujuan pendidikan kita ingin membunuh pengguna lain. Kami harus memastikan itu bukan pty kami dan mengacak daftar sehingga lebih bagus dan kami dapat mengatakan bahwa pty dipilih secara acak.
Perintah
pesan-pty ()pty lokal;
pty="$1"
;
echo -n "Anda akan masuk" > /dev/$pty;
untuk saya dalam 5 4 3 2 1;
melakukan
tidur 1;
echo -n " $i" > /dev/$pty;
selesai;
gema "Sampai jumpa!" > /dev/$pty;
tidur 1
ps | grep pty | grep -v -e $( mypty ) | urutkan --pengurutan acak | kepala -1 > stdin;
pesan-pty $( pty < stdin );
bunuh $( pid < stdin )
Keluaran di terminal orang lain
Anda akan turun dalam 5 4 3 2 1 Sampai jumpa!]
(keluar)
Contoh) Pengurutan versi - pengurutan ips
Seperti yang Anda ketahui, file sumber dapat diversi menggunakan string seperti 1.0. Selain itu, versi mungkin lebih dalam dengan nomor versi seperti 1.0.0 seperti yang terlihat dalam skema versi semantik populer.
Pengurutan versi memungkinkan Anda mengurutkan nomor versi version. Bagus! Sekarang apa? Mari kita mengujinya.
Untuk contoh ini, saya sudah menyiapkan skrip bash untuk menghasilkan ip acak sehingga kita tidak harus pergi ke sana. Ada di repo. Bagi kita yang tidak memiliki repo, inilah permulaan yang cepat.
Perintah
git clone https://github.com/temptemp3/linuxhint.com.gitalias random-ips='test -f "linuxhint.com/generate-random-ips.sh" ; bash $_'
Sekarang setelah Anda siap, mari kita mulai.
Garis komando
acak-ips 200 | tee ipsKeluaran
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
Oke, itu berhasil. Sekarang mari kita lihat apa yang terjadi ketika kita mencoba dan mengurutkan ips.
Garis komando
urutkan ipsKeluaran
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
Pada pandangan pertama, tampaknya berfungsi tetapi garis seperti 8.96.11.181 akan muncul di tempat lain.
Perintah
untuk o dalam d h n V g M
melakukan
urutkan ips -$o > ips$o,,
selesai
echo semua jenis sama dengan pengurutan numerik
diff ipsn,d 1>/dev/null || gema kamus pesanan != pengurutan numerik
diff ipsn,h 1>/dev/null || gema pengurutan numerik manusia != pengurutan numerik
diff ipsn,g 1>/dev/null || gema pengurutan numerik umum != pengurutan numerik
diff ipsn,v 1>/dev/null ||
pengurutan versi gema != pengurutan numerik
show_n_v_ips_diff="benar"
uji ! "$show_n_v_ips_diff" || perbedaan ipn,v
Keluaran
semua jenis sama dengan nomor uruturutan kamus != pengurutan numerik
pengurutan versi != pengurutan numerik
13,14h12
< 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
Seperti yang Anda lihat, pengurutan versi memungkinkan Anda untuk mengurutkan nomor versi ketika metode pengurutan lainnya gagal.
Contoh) Pengurutan versi - menyortir nama file dengan nomor versi
Berdasarkan contoh terakhir, mari gunakan sortir versi sedikit lebih dekat dengan tujuan penggunaannya. Seperti yang Anda ketahui, nomor versi biasanya muncul dalam nama file. Lihat Detail tentang pengurutan versi.
Pertama, mari kita ubah ips menjadi sesuatu yang lain seperti file sumber proyek.
Perintah
alfa ()alpha="abcdefghijklmnopqrstuvwxyz";
echo -n $alpha:$(( RANDOM % 26 ))::1
beta ()
alfa = "ab";
echo -n $alpha:$(( RANDOM % 2 ))::1
ip kucing | saat membaca -r baris; melakukan
echo $(alpha)-v$line$(test $(( RANDOM % 5 )) -eq 0 || beta).ter.gz;
selesai | tee teguk
Keluaran
x-v56.16.109.54.ter.gzk-v117.38.14.165a.ter.gz
d-v87.59.32.91a.ter.gz
h-v115.215.64.100.ter.gz
s-v72.174.246.218b.ter.gz
h-v163.93.19.173.ter.gz
u-v184.225.11.92b.ter.gz
y-v205.53.5.211a.ter.gz
t-v175.196.164.17b.ter.gz
e-v167.42.221.178b.ter.gz
c-v126.54.190.189b.ter.gz
b-v169.180.221.131a.ter.gz
y-v210.125.170.231a.ter.gz
x-v71.56.120.9b.ter.gz
Olahraga
Buat perintah di atas berjalan lebih cepat menggunakan xargs
Lihat contoh cara menggunakan perintah xargs di skrip bash.
Kali ini, kami bahkan tidak akan repot-repot menggunakan metode penyortiran lainnya.
Garis komando
sortir -V tegukKeluaran
d-v127.100.108.192.ter.gze-v62.140.229.42a.ter.gz
e-v149.77.211.215a.ter.gz
e-v167.42.221.178b.ter.gz
e-v194.189.236.29a.ter.gz
e-v198.145.199.84b.ter.gz
e-v240.1.147.196b.ter.gz
f-v50.100.142.42b.ter.gz
f-v117.58.230.116.ter.gz
f-v139.17.210.68b.ter.gz
f-v153.18.145.133b.ter.gz
g-v201.153.203.60b.ter.gz
g-v213.58.67.108.ter.gz
h-v5.206.37.224.ter.gz
Sekarang Anda melihat bahwa pengurutan versi mungkin berguna saat menyortir nama file dengan nomor versi.
Pra sortir
Sortir memiliki empat opsi utama yang memengaruhi penyortiran aktual yaitu, -ignore-leading-blanks, -ignore-case, -ignore-nonprinting, dan -dictionary-order, yang mungkin tumpang tindih atau tidak. Contoh menggunakan setiap opsi ikuti.
Urutkan dengan mengabaikan bagian kosong di depan
Sortir memungkinkan input kosong di depan diabaikan sebagai opsi. Kosong terkemuka dipertahankan dalam output yang diurutkan.
Pilihan
--abaikan-awal-kosongPemakaian
sort --ignore-leading-blanksPerintah
orang terkenal > fpkucing >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | urutkan | tac
Keluaran
Alfred Hitchcock (1899 - 1980)Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
Perhatikan bahwa spasi awal di baris yang ditambahkan ke fp muncul pertama kali dalam output sortir.
Untuk memperbaikinya, kita perlu mengabaikan kosong di depan sebagai berikut:.
Perintah
orang terkenal > fpkucing >> fp << EOF
Marilyn Monroe (1926 - 1962)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | sort --ignore-leading-blanks --ignore-leading-blanks | tac
Keluaran
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)
Alternatif
kucing fp | sed 's/^\s*//' | urutkan | tacPerhatikan bahwa alternatif tidak mempertahankan bagian kosong di depan dalam output sortir.
Urutkan pengabaian kasus
Sortir memungkinkan kasus input diabaikan sebagai opsi. Kasing disimpan dalam output yang diurutkan.
Pilihan
--kasus abaikanPemakaian
sort --ignore-casePerintah
orang terkenal > fpkucing >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | urutkan | tac
Keluaran
Amelia Earhart (1897 - 1937)Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
Perhatikan bahwa spasi awal di baris yang ditambahkan ke fp muncul pertama kali dalam output sortir.
Untuk memperbaikinya, kita perlu mengabaikan kosong di depan sebagai berikut:.
Perintah
orang terkenal > fpkucing >> fp << EOF
Abraham Lincoln (1809 - 1865)
Abraham Lincoln (1809 - 1865)
EOF
kucing fp | sort --ignore-case | tac
Keluaran
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)
Alternatif
kucing fp | saat membaca -r baris ; lakukan echo $baris,, ; selesai | urutkan | tacPerhatikan bahwa alternatif tidak mempertahankan kasus dalam output sortir.
Urutkan mengabaikan noncetak
Sortir memungkinkan input noncetak diabaikan sebagai opsi. Nonprinting dipertahankan dalam output yang diurutkan.
Pilihan
--abaikan-nonprintingPemakaian
sort --ignore-nonprintingPerintah
orang terkenal > fpecho -e "\x90Abe" >> fp
kucing fp | urutkan | tac
Keluaran
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)
Sepertinya kita kehilangan 'Abe' lakukan untuk karakter yang tidak dicetak dalam input pengurutan.
Untuk memperbaikinya, kita perlu mengabaikan karakter non-cetak.
Perintah
orang terkenal > fpecho -e "\x90Abe" >> fp
kucing fp | sort --ignore-nonprinting | tac
[/cc\
Keluaran
[cc lang="bash"]
Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Abe
Urutkan urutan kamus
Sortir memungkinkan semua input diabaikan kecuali spasi dan karakter alfanumerik sebagai opsi. Input dipertahankan dalam output yang diurutkan.
orang terkenal > fpecho -e "\x90Abe" >> fp
kucing fp | urutkan --d | tac
Sortir postingan
Sortir memiliki satu opsi utama yang tidak memengaruhi penyortiran yaitu, -reverse. Namun, ini memengaruhi output, memungkinkan urutan diubah antara naik dan turun. Contoh berikut.
Urutkan keluaran terbalik
Sortir memungkinkan output ditampilkan dalam urutan terbalik sebagai opsi.
Pilihan
--balikPemakaian
urutkan --terbalikGaris komando
orang terkenal | urutkan --terbalikKeluaran
Angelina Jolie (1975 - )Amelia Earhart (1897 - 1937)
Alfred Hitchcock (1899 - 1980)
Albert Einstein (1879 - 1955)
Al Gore (1948 - )
Abraham Lincoln (1809 - 1865)
Alternatif
urutkan | tacPilihan lain untuk pengurutan
Ada dua puluh dua opsi lain untuk pengurutan. Contoh mengikuti.
Sortir cek
Sortir memiliki opsi yang memungkinkan Anda untuk memeriksa apakah input diurutkan. Ini kembali setelah contoh pertama dari garis yang tidak disortir. Jika input diperlukan untuk diurutkan tetapi kemungkinan sudah diurutkan, menggunakan pemeriksaan pengurutan adalah tepat.
Pilihan
--memeriksaPemakaian
urutkan --centangGaris komando
barisan 10 | urutkan --pengurutan acak | urutkan --centangKeluaran
urutkan: -:3: ketidakteraturan: 10Garis komando
barisan 10 | urutkan --pengurutan acak | urutkan | urutkan --centangKeluaran
(kosong)Sortir keluaran
Sortir memiliki opsi yang memungkinkan Anda menentukan file untuk menulis alih-alih menggunakan keluaran atau pengalihan standar. Penggunaannya dapat meningkatkan kompatibilitas di seluruh lingkungan skrip.
Pilihan
--keluaran = FILEPemakaian
urutkan --output=FILEGaris komando
barisan 10 | sort --random-sort --output=random-10Keluaran
(kosong)Urutkan null diakhiri
Sortir memiliki opsi yang memungkinkan Anda menyetel pembatas baris ke nol alih-alih baris baru.
Pilihan
--berakhir nolPemakaian
urutkan --dihentikan nolGaris komando
barisan 10 | tr '\012' '\000' | urutkan --berakhir nol --pengurutan acakKeluaran
25346178910Urutkan stabil
Sortir memiliki opsi yang memungkinkan Anda menonaktifkan perbandingan pilihan terakhir. Akibatnya, runtime yang lebih stabil dapat dicapai jika input cukup besar yang dapat menyebabkan sortir berjalan tidak stabil.
Pilihan
--stabilPemakaian
sort --stabil --Garis komando
deret waktu 1000000 | urutkan --pengurutan acak | sort --stable >/dev/nullKeluaran
nyata 0m9.138 detikpengguna 0m9.201 detik
sys 0m0.107 detik
Urutkan ukuran buffer
Sortir memiliki opsi yang memungkinkan Anda untuk mengatur jumlah memori yang digunakan sebagai buffer saat menyortir. Ini dapat digunakan untuk membatasi konsumsi memori menyortir input yang lebih besar. Performa mungkin terpengaruh.
Pilihan
--buffer-size = UKURANPemakaian
urutkan --buffer-size=64Garis komando
deret waktu 1000000 | urutkan -urutkan acak | sort -stable -buffer-size=64 >/dev/null
Keluaran
nyata 0m21.685 detikpengguna 0m9.858 detik
sys 0m2.092s
Urutkan unik
Sortir memiliki opsi yang memungkinkan Anda menghapus baris duplikat dalam output sortir
Pilihan
--unikPemakaian
sort --unikuniGaris komando gema 1 2 2 4 5 | tr '\040' '\000' | urutkan --berakhir nol --unik
Keluaran
1245Alternatif
urutkan | unikKesimpulan
Sort adalah perintah eksternal yang berguna tidak hanya ketika digunakan dalam kombinasi dengan perintah eksternal lainnya, tetapi juga berguna ketika digunakan dengan perintah tanpa metode pengurutan bawaan seperti fungsi yang ditentukan pengguna atau skrip bash secara umum.