Использование сортировка --stable
, --reverse
и --key
опции:
sort --stable --reverse --key=1,2 freeswitch.log
(Для недидактических целей его можно сократить до -srk1,2
.)
Команда sort
(как и следовало ожидать) выводит каждую строку именованных файлов (или STDIN) в отсортированном порядке. Что делает каждый из этих вариантов:
- Опция
--reverse
указывает sort
сортировать строки с большими значениями (более поздние даты) выше , а не ниже. На основании других ответов предполагается, что это то, что вы подразумеваете под «по убыванию» (даже если этот вид сортировки обычно считается «возрастающим»). Если вы хотите отсортировать строки в хронологическом порядке, эту опцию опустите.
- Опция
--key=1,2
указывает sort
использовать только первые два разделенных пробелами «поля» («freeswitch.log:» - префикс с указанием даты и времени) в качестве ключа для сортировки. Важно, чтобы вы указали поле last для использования, даже если вы сортируете только по одному полю (например, если каждая строка хранит время и дату вместе в стандартном поле ISO-8601, например freeswitch.log 2011-09-08T12:21:07.282236
, вы бы использовали -k 2,2
), так как по умолчанию поля, используемые ключом, простираются до конца строки .
- Опция
--stable
указывает sort
не выполнять «последнее средство заказа». Без этой опции строка с двумя равными ключами (как указано в опции --keys
) будет затем отсортирована в соответствии с всей строкой , что означает, что имя файла и / или содержимое изменит порядок сортировки строк.
Важно указать оба экстента --key
, а также параметр --stable
. Без них несколько строк вывода, которые произошли одновременно (другими словами, многострочное сообщение), будут отсортированы в соответствии с содержимым сообщения (без второго поля в --key
) и / или именем файла ( без --stable
, если имя файла является отдельным полем, как описано ниже).
Другими словами, сообщение в журнале выглядит так:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 ^
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets?
будет "отсортировано" по:
freeswitch.log:2011-09-08 12:21:10.374238
freeswitch.log:2011-09-08 12:21:10.374238 ^
freeswitch.log:2011-09-08 12:21:10.374238 close your brackets?
freeswitch.log:2011-09-08 12:21:10.374238 did you forget to
freeswitch.log:2011-09-08 12:21:10.374238 My[brackets(call)
freeswitch.log:2011-09-08 12:21:10.374238 Suggestion:
freeswitch.log:2011-09-08 12:21:10.374238 Warning: Syntax error on line 20:
Это "отсортировано" (потому что "c" предшествует "d", а "S" предшествует "W"), но это не в порядке . Указание --stable
(и ограничение --key
ограниченным) пропустит дополнительную сортировку, а сохранит порядок , который вам нужен.
Кроме того, сортировка по этому комбинированному полю имени и даты будет работать, только если каждая строка в вашем выводе начинается с одного и того же имени файла. С учетом синтаксиса, который вы опубликовали, если у вашего ввода есть несколько разных имен файлов, которые вы хотите игнорировать при сортировке, вам нужно использовать программу типа sed
, чтобы преобразовать имя файла в его собственное разделенное пробелами поле, а затем передать преобразованные строки в sort
(после чего вы можете преобразовать разделители полей обратно):
sed 's/:/ /' freeswitch.log | sort -srk2,3 | sed 's/ /:/'
Обратите внимание, что поля, используемые ключом, изменены на 2,3
, пропуская первое поле (имя файла).