【问题标题】:How to do dynamic calculation in bash如何在bash中进行动态计算
【发布时间】:2018-02-03 19:22:14
【问题描述】:

我有一个文件,它产生如下所示的输出。如何使用 Bash 以 GB 为单位转换 100571394 字节?有什么脚本吗?

 2018-02-01 23:29:01 CET usr1@abc.com 100571394 bytes   
 2018-02-01 23:29:58 CET usr2@abc.com 35196735 bytes   
 2018-02-01 23:30:56 CET usr3@abc.com 1187519 bytes  
 2018-02-01 23:34:01 CET usr4@abc.com 121153336 bytes  
 2018-02-01 23:37:13 CET usr5@abc.com 57589006 bytes

【问题讨论】:

  • 您想要千兆字节(GB 或 10⁹)还是千兆字节(GiB 或 2³⁰)?大小差异为 7.37%。处理千兆字节是一个编辑问题(在右数第 9 位之前添加一个小数点),而千兆字节也需要计算。你想要多少个小数位?尾随零?值能有多大?据推测,不会超过 PB (PB) 或 pebibytes (PiB),因此 64 位整数运算足以处理原始值,但您需要浮点运算(Bash not 提供,不像Korn 壳)。 expr 命令只处理整数 - 使用 bc
  • usr3@abc.com 的预期输出是什么——事实上,对于显示的每一行,因为没有一个值超过大约 1/10 GB?您可能应该使用 example.com 代替 abc.comexample.com 域保留用于此类用途,但 abc.com 是新闻/媒体公司。

标签: bash dynamic using calculation


【解决方案1】:

这是我使用的小脚本。它可能不正确,但这是我使用的。 YMMV

awk '{ split( "B KiB MiB GiB TiB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } print int($1) v[s] }'

例如:

echo 100571394 |
awk '{ split( "B KiB MiB GiB TiB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } print int($1) v[s] }'
95GiB

对于您的文件,您可以通过 while 循环运行它:

while IFS= read -r line; do 
    echo "$line" |
    awk '{print $5}' |
    awk '{ split( "B KiB MiB GiB TiB" , v ); s=1; while( $1>1024 ){ $1/=1024; s++ } print int($1) v[s] }'
done < Your_example_file
95MiB
33MiB
1MiB
115MiB
54MiB

【讨论】:

  • 据我估计,100571394 字节大约是 100 MiB 或 0.1 GiB。我认为您的尺寸缩小了 1024 倍(您忘记了允许简单字节 - 小于 1 KiB)。您可以使用echo 1 管道到您的脚本进行演示;它报告 1 KiB;对于echo 10,它报告10 KiB,所以它不仅仅是四舍五入。修复很简单:在KiB 之前添加B 和一个空格。
  • 感谢您指出这一点。我想我只将它用于非常大的数字,而这个脚本只是让它们变得更大!也感谢您的解决方案!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-07-13
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
相关资源
最近更新 更多