Saya memiliki direktori yang berisi file dengan nama-nama seperti di logXX
mana XX adalah dua-karakter, nol-empuk, nomor hex huruf besar seperti:
log00
log01
log02
...
log0A
log0B
log0C
...
log4E
log4F
log50
...
Secara umum akan ada kurang dari mengatakan 20 atau 30 total file. Tanggal dan waktu pada sistem khusus saya bukanlah sesuatu yang dapat diandalkan (sistem tertanam tanpa NTP atau sumber waktu GPS). Namun nama file akan meningkat secara andal seperti yang ditunjukkan di atas.
Saya ingin grep
melalui semua file untuk entri log tunggal terbaru dari jenis tertentu, saya berharap untuk cat
file bersama seperti ...
cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1
Namun terpikir oleh saya bahwa versi yang berbeda dari bash
atau sh
atau zsh
dll mungkin memiliki ide yang berbeda tentang bagaimana *
diperluas.
The man bash
halaman tidak mengatakan apakah atau tidak perluasan *
akan menjadi daftar abjad pasti naik dari nama file yang cocok. Tampaknya akan naik setiap kali saya mencobanya pada semua sistem yang saya miliki - tetapi apakah itu perilaku yang DITETAPKAN atau hanya implementasi spesifik?
Dengan kata lain, bisakah saya benar-benar mengandalkan cat /tmp/logs/log*
untuk menyatukan semua file log saya bersama-sama dalam urutan abjad?
sort
sama dengan yang untuk shell ketika itu memperluas pola globbing nama file.cat
dengangrep -h pattern /tmp/logs/log*
menekan nama file yang diawali dengan pertandingan. (Setidaknya dengan GNU grep, saya tidak memeriksa POSIX atau busybox.)cat
, ini adalah penggunaan yang tidak bergunasort
Jawaban:
Di semua shell, gumpalan diurutkan secara default. Mereka sudah oleh
/etc/glob
pembantu yang dipanggil oleh shell Ken Thompson untuk memperluas gumpalan di versi pertama Unix di awal 70-an (dan yang memberi gumpalan nama mereka).Sebab
sh
, POSIX memang mengharuskan mereka untuk disortir dengan carastrcoll()
, yaitu menggunakan urutan penyortiran di lokal pengguna, sepertils
meskipun beberapa masih melakukannya melaluistrcmp()
, yang didasarkan pada nilai byte saja.Anda mungkin memperhatikan di atas bahwa untuk shell yang melakukan pengurutan berdasarkan lokal, di sini pada sistem GNU dengan
en_GB.UTF-8
lokal,-
dalam nama file diabaikan untuk pengurutan (kebanyakan karakter tanda baca akan). Theó
diurutkan dengan cara yang lebih diharapkan (setidaknya untuk orang-orang Inggris), dan kasus diabaikan (kecuali ketika datang untuk memutuskan ikatan).Namun, Anda akan melihat beberapa inkonsistensi untuk log① log②. Itu karena urutan penyortiran ① dan ② tidak didefinisikan di lokal GNU (saat ini; semoga akan diperbaiki suatu hari). Mereka mengurutkan sama, sehingga Anda mendapatkan hasil acak.
Mengubah lokal akan memengaruhi urutan pengurutan. Anda dapat mengatur lokal ke C untuk mendapatkan
strcmp()
semacam-seperti:Perhatikan bahwa beberapa lokal dapat menyebabkan beberapa kebingungan bahkan untuk string all-ASCII all-alnum. Seperti yang berbahasa Ceko (setidaknya pada sistem GNU) di mana
ch
ada elemen penyusun yang berurutanh
:Atau, seperti yang ditunjukkan oleh @ninjalj, bahkan yang lebih aneh di lokal Hongaria:
Di
zsh
, Anda dapat memilih penyortiran dengan kualifikasi glob . Misalnya:Jenis numerik
echo *(n)
juga dapat diaktifkan secara global dengannumericglobsort
opsi:Jika Anda (seperti saya) bingung dengan urutan itu dalam contoh tertentu (di sini menggunakan bahasa Inggris saya), lihat di sini untuk detailnya.
sumber
&C<cs<<<Cs<<<CS
, sementara&C<cs<<<cS<<<Cs<<<CS
ditandai sebagai konsep eksperimental yang diusulkan. Dilihat dari beberapa data lama yang diimpor ke CLDR, AIX dan MS yang lebih tua tampaknya lebih suka tampilan "huruf kecil kemudian huruf besar adalah 2 elemen susunan berbeda".Halaman manual untuk bash menentukan:
sumber
man
rendering dempul atau teks ... jika teks yang saya cari "dibungkus dengan kata" maka perintah / search tidak akan menemukannya. Hanya memaksimalkan terminal saya dan itu dia :)bash
. OP juga tertarik pada "zsh dll."Kecuali jika Anda memicu beberapa opsi shell yang sangat spesifik di beberapa shell, hasilnya dijamin sama.
Urutan ditentukan dalam standar POSIX :
Lihat juga Kategori LC_COLLATE di POSIX Locale , yang secara singkat mengatakan bahwa jika
LC_COLLATE=C
, maka semuanya dipesan dalam urutan ASCII.The
bash
pengguna menyebutkanksh93
danzsh
memiliki kata-kata yang serupa, yang membuat saya percaya bahwa mereka mengikuti standar POSIX dalam hal ini.Kerang lain, suka
pdksh
dandash
tidak mengatakan apa-apa tentang penyortiran nama file yang dihasilkan dari penggumpalan nama file. Saya tergoda untuk percaya bahwa ini berarti mereka masih mematuhi standar yang sama, setidaknya ketika menggunakan lokal POSIX. Dalam pengalaman saya, saya belum menemukan shell yang melakukan pemilahan nama file ASCII secara "aneh".sumber
numericglobsort
opsizsh
yang akan memengaruhi penyortiran. Meskipun saya lebih suka mengaktifkannya pada basis per-globalecho *(n)
daripada mengaktifkan opsi secara global.--posix
opsi baris perintah atau menjalankanset -o posix
posix
mode Bash . Lihat gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html Hal ini membuat saya percaya (berharap, lebih tepatnya) bahwa penyortirannya adalah sesuai dengan POSIX.Jika tujuan utamanya adalah mengurutkan file input berdasarkan umurnya, yang tertua terlebih dahulu, Anda dapat menulis
Dan jika log diputar dan dikompresi juga terlibat:
sumber