Концептуально да, закрепление некоторых MAC-адресов является возможным решением (в соответствии с ответом @daniel выше ), но у этого есть много недостатков:
Для определенного шаблона, такого как этот, вы можете разделить имя пути на отдельные компоненты /
и -
, поместив их в начале строки,
awk '{
split($0, f, "[/-]");
printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0
}'
, затем отсортируйте дату(yyyy-mm-dd
)и имя файла (, например.access_NN.log.gz
)соответственно
sort
и, наконец, отделить компоненты сортировки
cut -f3-
Предполагая, что образцы данных находятся в файле /tmp/logs
, вы можете собрать их вместе следующим образом
awk '{ split($0, f, "[/-]"); printf "%04d-%02d-%02d\t%s\t%s\n", f[6], f[5], f[4], f[7], $0 }' /tmp/logs |
sort |
cut -f3-
/tmp/archive/9-7-2020/access_01.log.gz
/tmp/archive/9-7-2020/access_02.log.gz
/tmp/archive/9-7-2020/access_03.log.gz
/tmp/archive/9-7-2020/error_03.log.gz
/tmp/archive/9-7-2020/error_04.log.gz
/tmp/archive/9-7-2020/error_05.log.gz
/tmp/archive/9-8-2020/error_01.log.gz
/tmp/archive/9-8-2020/error_02.log.gz
/tmp/archive/9-8-2020/error_03.log.gz
/tmp/archive/9-8-2020/error_04.log.gz
/tmp/archive/9-8-2020/error_05.log.gz
/tmp/archive/9-9-2020/access_01.log.gz
/tmp/archive/9-9-2020/access_02.log.gz
/tmp/archive/9-9-2020/access_03.log.gz
/tmp/archive/9-10-2020/error_04.log.gz
/tmp/archive/9-10-2020/error_05.log.gz
Здесь, предполагая, что все строки всегда начинаются с /tmp/archive/
или чего-либо одинаковой длины, вы можете сделать:
sort -t- -k3,3.4n -k1.14,1n -k2,2n -k3.5
Что здесь можно упростить до:
sort -t- -k3n -k1.14n -k2n -k3.5
поскольку -
не будет разделителем тысяч ни в одной локали (, так как это также символ для отрицательного знака ), поэтому с флагом n
, ключевой спецификацией -k1.14n
(, который выберет 7-12-2020/access_04.log
в первой строке, например )или -k1.14,1n
(, которые выберут только 7
), оба дадут число7
.