【问题标题】:BASH printf numbers with 1 char suffix带有 1 个字符后缀的 BASH printf 数字
【发布时间】:2014-12-02 02:47:09
【问题描述】:

我正在尝试在 BASH 中格式化数字。我想复制 iptables 输出的字节/数据包数。

这里有一些例子:

258
591K
55273
37G
22244
2212
6127K
12M
114K

如你所见:

  • 没有千位分隔符,
  • 该字段的宽度最多为 5 个字符,
  • 每个后缀是:无、K、M、G 等...

我搜索了有关 printf 的文档,但找不到任何可以以这种方式格式化数字的内容。有人知道怎么做吗?

谢谢。

【问题讨论】:

  • 每个输出的输入数字是多少?为什么有些大于 1024 的值没有缩短为 K 版本?
  • 这是查看规则时iptables的默认格式。但是,例如,可以使用 [iptables -vnxL INPUT] 找到完整的字节数。至于为什么不是所有人都皈依?不知道。如果我不得不猜测,我会说最初的程序员想要给出尽可能多的数字,最多可达 100,000。然后(因为字段只有 5 个字符宽)使用单个字符后缀进行转换。 :)

标签: bash numbers format printf


【解决方案1】:

您可以使用awk 构建自定义格式,如下所示:

awk 'BEGIN{ u[0]=""; u[1]="K"; u[2]="M"; u[3]="G"} { n = $1; i = 0; while(n > 1000) { i+=1; n= int(n/1000) } print n u[i] } '

输入样本:

258
591000
55273
37000000000
22244
2212
6127000
12000000
114000

输出:

258
591K
55K
37G
22K
2K
6M
12M
114K

【讨论】:

  • 感谢 quantdev,另一个不错的解决方案 - 这是一个很棒的单线!我会测试它,看看它是否适合。 :)
【解决方案2】:

必须以编程方式完成,但这并不难

#!/bin/sh
humanFormat() {
    test $x -gt 1000000000 && x=`expr x / 1000000000`G
    test $x -gt 1000000 && x=`expr x / 1000000`M
    test $x -gt 1000 && x=`expr x / 1000`K
}

(已编辑以修复执行顺序)

【讨论】:

  • 不要使用exprx=$((x / 1000)K/等。此外,您在此处的语句顺序将被严重评估,并且您的第二个测试表达式将在您分配给 x 的非数字值上爆炸。
  • 糟糕,你说的是订单,我在打字时注意到了它,然后分心了。我使用 expr 因为我写的是 /bin/sh 脚本,而不是 /bin/bash 脚本。
  • 从我所阅读的所有内容中,非常很少(非 posix)版本的sh(和衍生品)不理解算术上下文。
  • 干得好,安德拉斯。我喜欢那一个。 :) 我猜这不是 printf 的内置功能?我将对此进行测试,看看它如何处理我的数字。 :)
猜你喜欢
  • 2014-12-05
  • 1970-01-01
  • 2017-03-18
  • 1970-01-01
  • 2022-01-09
  • 1970-01-01
  • 1970-01-01
  • 2019-11-22
  • 1970-01-01
相关资源
最近更新 更多