Предполагая, что каждая запись в файле начинается с даты, и опция --key=2,3
не требуется, пожалуйста, попробуйте:
find . -name "*.log" -exec cat '{}' \; | sort -z | xargs -I{} -0 echo "{}"
Последняя команда xargs .. echo ..
потребуется для правильной печати нулевого значения-конечные строки.
Если вам все еще требуется опция --key
, измените код, как вам нравится. Я не знаю, как выглядят линии на данный момент.
[ОБНОВЛЕНИЕ]
Согласно предоставленной OP информации, я предполагаю, что формат файлов журнала будет:
- Каждая запись начинается с даты в формате
"yyyy-mm-ddTHH:MM:SS.nanosec"
и может применяться простая сортировка по словарю. - Каждая запись заканчивается на
"\n\0"
, за исключением последней записи файла, которая заканчивается только на "\n"
. - Каждая запись может содержать символы новой строки в середине как часть записи для цели сгиба строки.
Тогда как насчет:
find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z
echo -ne "\0"
добавляет нулевой символ к последней записи файла. В противном случае запись будет объединена со следующей записью другого файла. - Опция
-z
для sort
обрабатывает нулевой символ как разделитель записей. - Никакой другой опции для
sort
потребуется до сих пор.
Результат с опубликованным вводом OP:
2019-08-22T13:33:44.123456789 Hello
World
2019-08-22T13:33:44.123456789 Hello
World 2
2019-09-44T13:44:21.987654321 Simple line
2020-01-01T11:22:33.123456789 late
2020-01-01T11:22:33.123456789 late 2
Он по-прежнему сохраняет нулевой символ "\0"
в конце каждой записи. Если вы хотите обрезать его, добавьте команду tr -d "\0"
в конце конвейера как:
find . -name "*.log" -type f -exec cat "{}" \; -exec echo -ne "\0" \; | sort -z | tr -d "\0"
Надеюсь, это поможет.