Как использовать команду сортировки Unix для сортировки по понятному человеку числовому размеру файла в столбце? - PullRequest
3 голосов
/ 30 апреля 2019

На этот вопрос теперь дан ответ - прокрутите до конца этого поста для решения.

Извиняюсь, если ответ уже здесь, но все ответы, которые я нашел до сих пор, предполагают либо флаг -h, либо-n флаг, и ни один из них не работает для меня ...

У меня есть некоторые выходные данные команды curl, которая дает мне несколько столбцов данных.Один из этих столбцов - это читаемый человеком размер файла («1,6 МБ», «4,3 ГБ» и т. Д.).

Я использую команду unix sort для сортировки по соответствующему столбцу,но, похоже, он пытается отсортировать по алфавиту, а не по количеству.Я пытался использовать флаги -n и -h, но, хотя они и меняют порядок, ни в одном из них порядок численно не верен.

Я на CentOS Linux box версии 7.2.1511.У меня установлена ​​версия sort"sort (GNU coreutils) 8.22".

Я пытался использовать флаг -h в следующих форматах:

curl localhost:9200/_cat/indices | sort -k9,9h | head -n5
curl localhost:9200/_cat/indices | sort -k9 -h | head -n5
curl localhost:9200/_cat/indices | sort -k 9 -h | head -n5
curl localhost:9200/_cat/indices | sort -k9h | head -n5

Я всегда получаю такие результаты:

green open indexA            5 1        0       0   1.5kb    800b
green open indexB            5 1  9823178 2268791 152.9gb  76.4gb
green open indexC            5 1    35998    7106 364.9mb 182.4mb
green open indexD            5 1      108      11 387.1kb 193.5kb
green open indexE            5 1        0       0   1.5kb    800b

Я пытался использовать флаг -n в тех же форматах, что и выше:

curl localhost:9200/_cat/indices | sort -k9,9n | head -n5
curl localhost:9200/_cat/indices | sort -k9 -n | head -n5
curl localhost:9200/_cat/indices | sort -k 9 -n | head -n5
curl localhost:9200/_cat/indices | sort -k9n | head -n5

Я всегда получаю эти результаты:

green open index1      5 1     1021       0   3.2mb   1.6mb
green open index2      5 1     8833       0   4.1mb     2mb
green open index3      5 1     4500       0     5mb   2.5mb
green open index4      1 0        3       0   3.9kb   3.9kb
green open index5      3 1  2516794       0   8.6gb   4.3gb

Редактировать: Оказалось, что есть две проблемы:

1) сортировка ожидает увидеть заглавные буквы - M, K и G вместо mb, kb и gb (для байтов вы можете просто оставить пустым).

2) сортировка будет включать начальные пробелы, если вы явно не исключите их, что портит порядок.

Решение состоит в том, чтобы заменить строчные буквы заглавными и использовать флаг -b дляmake sort игнорирует начальные пробелы (я основал этот ответ на решении @Vinicius ниже, потому что его легче читать, если вы не знаете регулярное выражение):

curl localhost:9200/_cat/indices | tr '[kmg]b' '[KMG] ' | sort -k9hb

Ответы [ 2 ]

2 голосов
/ 30 апреля 2019

Ваши единицы измерения 'm' и 'g' должны быть заглавными. GNU sort руководство читает:

-ч - человек-числовой-сортировка --сорт = человек-числовой

Сортировать по номерам, сначала по числовому знаку (отрицательный, ноль или положительный); затем суффиксом SI (либо пустым, либо "k" или "K", либо одним из "MGTPEZY", в этом порядке; см. Размер блока); и, наконец, по числовому значению.

Вы можете изменить вывод curl с помощью GNU sed следующим образом:

curl localhost:9200/_cat/indices \
| sed 's/[0-9][mgtpezy]/\U&/g'
| sort -k9,9h \
| head -n5

Урожайность:

green open index4      1 0        3       0   3.9kb   3.9kb
green open index1      5 1     1021       0   3.2Mb   1.6Mb
green open index2      5 1     8833       0   4.1Mb     2Mb
green open index3      5 1     4500       0     5Mb   2.5Mb
green open index5      3 1  2516794       0   8.6Gb   4.3Gb

Другие буквы, такие как «b», будут рассматриваться как «без единицы»:

green open indexA            5 1        0       0   1.5kb    800b
green open indexE            5 1        0       0   1.5kb    800b
green open indexD            5 1      108      11 387.1kb 193.5kb
green open indexC            5 1    35998    7106 364.9Mb 182.4Mb
green open indexB            5 1  9823178 2268791 152.9Gb  76.4Gb

При желании можно изменить единицы измерения в отсортированном выводе обратно в нижний регистр, указав значение sed 's/[0-9][MGTPEZY]/\L&/g'

1 голос
/ 30 апреля 2019

sort не понимает кб, мб и гб. Вы должны использовать K, M и G. Вы можете использовать tr для преобразования суффиксов:

curl localhost:9200/_cat/indices | tr 'kmgb' 'KMG ' | sort -b -k 9 -h
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...