将字节数转换为人类KiB MiB等的标准工具;像du,ls1

Modified on: Sat, 30 Jun 2018 10:12:00 +0800

是否有标准工具将整数字节数转换为人类可读的最大单位大小计数,同时将数值保持在1.00和1023.99之间?

我有自己的bash / awk脚本,但我正在寻找一个标准工具,它可以在很多/大多数发行版中找到...更通用的东西,理想情况下有简单的命令行args,和/或可以接受管道输入。

以下是我正在寻找的输出类型的一些示例。

    1    Byt  
  173.00 KiB  
   46.57 MiB  
    1.84 GiB  
   29.23 GiB  
  265.72 GiB  
    1.63 TiB  

这是 bytes-human 脚本(用于上述输出)

awk -v pfix="$1" -v sfix="$2" 'BEGIN { 
      split( "Byt KiB MiB GiB TiB PiB", unit )
      uix = uct = length( unit )
      for( i=1; i<=uct; i++ ) val[i] = (2**(10*(i-1)))-1
   }{ if( int($1) == 0 ) uix = 1; else while( $1 < val[uix]+1 ) uix--
      num = $1 / (val[uix]+1)
      if( uix==1 ) n = "%5d   "; else n = "%8.2f"
      printf( "%s"n" %s%s\n", pfix, num, unit[uix], sfix ) 
   }'

更新以下是 Gilles'脚本的修改版本,如对其答案的评论中所述..(已根据我的喜好进行了修改)。

awk 'function human(x) {
         s=" B   KiB MiB GiB TiB EiB PiB YiB ZiB"
         while (x>=1024 && length(s)>1) 
               {x/=1024; s=substr(s,5)}
         s=substr(s,1,4)
         xf=(s==" B  ")?"%5d   ":"%8.2f"
         return sprintf( xf"%s\n", x, s)
      }
      {gsub(/^[0-9]+/, human($1)); print}'
作者:,Peter.O

最佳答案

不,没有这样的标准工具。

由于GNU coreutils 8.21(2013年2月,所有发行版中尚未出现),在非嵌入式Linux和Cygwin上,您可以使用numfmt。它不会产生完全相同的输出格式(对于coreutils 8.23,我认为你不能得到小数点后的2位数字。)

$ numfmt --to=iec-i --suffix=B --padding=7 1 177152 48832200 1975684956
     1B
 173KiB
  47MiB
 1.9GiB

许多较旧的GNU工具可以生成此格式,并且GNU排序可以对单位数量进行排序自coreutils 7。5(2009年8月,在现代非嵌入式Linux发行版中出现)。


我觉得你的代码有点费解。这是一个更清晰的awk版本(输出格式不完全相同):

awk '
    function human(x) {
        if (x<1000) {return x} else {x/=1024}
        s="kMGTEPZY";
        while (x>=1000 && length(s)>1)
            {x/=1024; s=substr(s,2)}
        return int(x+0.5) substr(s,1,1)
    }
    {sub(/^[0-9]+/, human($1)); print}'

转发自更专业的问题

作者:,Gilles

相关问答

添加新评论