У меня есть каталог, заполненный файлами с именами, например, logXX
где XX - это двухсимвольное шестнадцатеричное число, набранное нулями, например:
log00
log01
log02
...
log0A
log0B
log0C
...
log4E
log4F
log50
...
Обычно будет меньше, чем, скажем, 20 или 30 файлов. На дату и время моей конкретной системы нельзя положиться (встроенная система без надежных источников времени NTP или GPS). Однако имена файлов будут надежно увеличиваться, как показано выше.
Я хочу grep
просмотреть все файлы для самой последней записи в журнале определенного типа, я надеялся, cat
что файлы вместе, такие как ...
cat /tmp/logs/log* | grep 'WARNING 07 -' | tail -n1
Однако мне пришло в голову, что разные версии bash
или sh
и zsh
т. Д. Могут иметь разные представления о том, как *
расширяется.
На man bash
странице не указано, будет ли расширение *
списка определенно восходящим алфавитным списком совпадающих имен файлов. Кажется, он поднимается каждый раз, когда я пробовал его на всех доступных мне системах - но это ОПРЕДЕЛЕННОЕ поведение или просто конкретная реализация?
Другими словами, могу ли я полностью полагаться на cat /tmp/logs/log*
объединение всех моих файлов журнала в алфавитном порядке?
sort
такой же, как и для оболочки, когда она расширяет шаблон выделения имени файла.cat
с ,grep -h pattern /tmp/logs/log*
чтобы подавить предваряя имена файлов на матчи. (По крайней мере с GNU grep я не проверял POSIX или busybox.)cat
, это бесполезное использованиеsort
Ответы:
Во всех оболочках глобусы сортируются по умолчанию. Они уже были
/etc/glob
помощником, вызванным оболочкой Кена Томпсона, чтобы расширить глобусы в первой версии Unix в начале 70-х (и которая дала глобусам их имя).Поскольку
sh
POSIX требует, чтобы они сортировались в порядкеstrcoll()
, то есть с использованием порядка сортировки в локали пользователя, например,ls
хотя некоторые все еще делают это черезstrcmp()
, что основано только на байтовых значениях.Вы можете заметить выше, что для тех оболочек, которые выполняют сортировку на основе локали, здесь, в системе GNU с
en_GB.UTF-8
локалью,-
в именах файлов игнорируется для сортировки (большинство знаков препинания будет). Ониó
сортируются более ожидаемым образом (по крайней мере, для британцев), и случай игнорируется (за исключением случаев, когда речь идет о решении связей).Однако вы заметите некоторые несоответствия для log① log①. Это потому, что порядок сортировки ① и ② не определен в локалях GNU (в настоящее время; надеюсь, он когда-нибудь будет исправлен). Они сортируют одинаково, так что вы получите случайные результаты.
Изменение языкового стандарта повлияет на порядок сортировки. Вы можете установить локаль в C, чтобы получить
strcmp()
подобную сортировку:Обратите внимание, что некоторые локали могут вызвать некоторую путаницу даже для строк all-alnum all-ASCII. Как Чешские из них (в системах GNU , по крайней мере) , где
ch
представляет собой упорядочивающий элемент , который сортирует после того, какh
:Или, как отметил @ninjalj, даже более странные в венгерских регионах:
В
zsh
, вы можете выбрать сортировку с квалификаторами glob . Например:Числовой вид
echo *(n)
также можно включить глобально с помощьюnumericglobsort
опции:Если вы (как и я) были озадачены этим порядком в данном конкретном случае (здесь используется моя британская локаль), см. Подробности здесь .
источник
&C<cs<<<Cs<<<CS
, в то время&C<cs<<<cS<<<Cs<<<CS
как помечен как предлагаемый экспериментальный проект. Судя по некоторым более старым данным, импортированным в CLDR, старые AIX и MS, по-видимому, предпочитали представление «строчные и прописные два разных элемента сопоставления».Страница man для bash указывает:
источник
man
текстовом рендеринге ... если текст, который я ищу, получит "завернутый в слово", то команда / search не найдет его. Просто развернул мой терминал и вот он :)bash
. Tho OP также интересовался "zsh и т. Д."Если вы не активируете некоторые специфические параметры оболочки в некоторых оболочках, выходные данные гарантированно будут одинаковыми.
Порядок указан в стандарте POSIX :
См. Также категорию LC_COLLATE в локали POSIX , которая вкратце говорит, что если
LC_COLLATE=C
, то все упорядочено в порядке ASCII.bash
Руководство упоминаетksh93
иzsh
имеет аналогичную формулировку, которая заставляет меня полагать, что они следуют стандарту POSIX в этом отношении.Другие оболочки, такие как
pdksh
иdash
ничего не говорят о сортировке имен файлов, возникающих в результате подстановки имен файлов. Я испытываю желание поверить, что это означает, что они по-прежнему придерживаются того же стандарта, по крайней мере, при использовании языкового стандарта POSIX. По моему опыту, я не сталкивался с оболочкой, которая выполняет какую-либо явно «странную» сортировку имен файлов ASCII.источник
numericglobsort
опциюzsh
, которая повлияет на сортировку. Хотя я бы предпочел включить его отдельно для каждого глобуса,echo *(n)
чем включить глобальную опцию.--posix
командной строки или выполнитьset -o posix
posix
режим Bash не влияет на сортировку по расширению символов-заглушек . См. Gnu.org/software/bash/manual/html_node/Bash-POSIX-Mode.html. Это наводит меня на мысль (скорее, скорее), что сортировка соответствует POSIX.Если основной целью является сортировка входных файлов по возрасту, сначала по возрасту, вы можете написать
И если повернутые и сжатые журналы также участвуют:
источник