如何使用Unix sort命令按列中可读的数字文件大小进行排序?

时间:2019-04-30 17:38:34

标签: linux sorting unix

此问题现已得到解答-滚动至帖子末尾以寻求解决方法。

很抱歉,如果答案已经在这里,但是到目前为止我找到的所有答案都建议使用-h标志或-n标志,而这些都不对我有用...

我从curl命令获得了一些输出,这些输出给了我几列数据。这些列之一是人类可读的文件大小(“ 1.6mb”,“ 4.3gb”等)。

我正在使用unix sort 命令按相关列进行排序,但是它似乎正在尝试按字母顺序而不是数字顺序进行排序。我曾尝试同时使用-n和-h标志,但是尽管它们确实改变了顺序,但在两种情况下,顺序在数字上都不正确。

我在CentOS Linux机器上,版本为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标志使排序忽略前导空格(我将此答案基于@Vinicius的以下解决方案,因为如果您不知道,它更容易阅读正则表达式):

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

2 个答案:

答案 0 :(得分:2)

您的'm'和'g'单位应为大写。 GNU sort manual读为:

  

-h --human-numeric-sort --sort = human-numeric

     

按数字顺序排列,首先按数字符号(负,零或正)排序;然后以SI后缀(该顺序为空,或者为“ k”或“ K”,或者为“ MGTPEZY”之一;请参见块大小);最后是数值。

您可以使用GNU curl来更改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 :(得分:1)

sort不理解kb,mb和gb。您必须使用K,M和G。您可以使用tr来转换后缀:

curl localhost:9200/_cat/indices | tr 'kmgb' 'KMG ' | sort -b -k 9 -h