在bash中将人类可读转换为字节

时间:2014-10-29 02:01:59

标签: linux bash awk human-readable

所以我试图在linux中分析非常大的日志文件,我已经看到了大量的解决方案,但是记录数据的程序不允许输出格式化,因此它只输出人类可读的格式(我知道,多么痛苦)。所以问题是:如何使用awk:

之类的东西将人类可读的字节转换为字节

转换这个:

937
1.43K
120.3M

为:

937
1464
126143693

我负担得起,我期待一些舍入错误。

提前致谢。

P.S。只要它可以提供内联转换,就不必是awk。

我找到this但是给出的awk命令似乎没有正常工作。它输出类似534K" 0"。

我也找到了一个使用sed和bc的解决方案,但因为它使用了bc,它的效果有限,这意味着它一次只能使用一列,所有数据都必须适合bc,否则就会失败。

sed -e 's/K/\*1024/g' -e 's/M/\*1048576/g' -e 's/G/\*1073741824/g' | bc

5 个答案:

答案 0 :(得分:12)

这是一个理解二进制和十进制前缀的函数,如果有需要,可以很容易地扩展到大型单位:

dehumanise() {
  for v in "${@:-$(</dev/stdin)}"
  do  
    echo $v | awk \
      'BEGIN{IGNORECASE = 1}
       function printpower(n,b,p) {printf "%u\n", n*b^p; next}
       /[0-9]$/{print $1;next};
       /K(iB)?$/{printpower($1,  2, 10)};
       /M(iB)?$/{printpower($1,  2, 20)};
       /G(iB)?$/{printpower($1,  2, 30)};
       /T(iB)?$/{printpower($1,  2, 40)};
       /KB$/{    printpower($1, 10,  3)};
       /MB$/{    printpower($1, 10,  6)};
       /GB$/{    printpower($1, 10,  9)};
       /TB$/{    printpower($1, 10, 12)}'
  done
} 

示例:

$ dehumanise 2K 2k 2KiB 2KB 
2048
2048
2048
2000

$ dehumanise 2G 2g 2GiB 2GB 
2147483648
2147483648
2147483648
2000000000

后缀不区分大小写。

答案 1 :(得分:4)

cat dehumanise 
937
1.43K
120.3M
awk '/[0-9]$/{print $1;next};/[mM]$/{printf "%u\n", $1*(1024*1024);next};/[kK]$/{printf "%u\n", $1*1024;next}' dehumanise
937
1464
126143692

答案 2 :(得分:3)

使用GNU coreutils中的numfmt --from=iec

答案 3 :(得分:2)

存在Python工具

$pip install humanfriendly  # Also available as a --user install in ~/.local/bin

$humanfriendly --parse-size="2 KB"
2000
$humanfriendly --parse-size="2 KiB"
2048

答案 4 :(得分:0)

  

awk'函数pp(p){printf“%u \ n”,$ 0 * 1024 ^ p} / [0-9] $ / {print   $ 0} / K $ / {pp(1)} / M $ / {pp(2)} / G $ / {pp(3)} / T $ / {pp(4)} / [^ 0-9KMGT] $ / {print 0}'

这是对@starfry答案的修改。


我们将其分解:

  

函数pp(p){printf“%u \ n”,$ 0 * 1024 ^ p}

定义一个名为pp的函数,该函数采用单个参数p并输出$0乘以1024的p-th次幂。 %u将打印该数字的无符号十进制整数。

  

/ [0-9] $ / {打印$ 0}

匹配以数字结尾的行($与行的末尾匹配),然后在{}内运行代码。打印整行($0

  

/ K $ / {pp(1)}

匹配以大写字母K结尾的行,调用函数pp()并将1传递给它(p == 1)。 注意::在数学方程式中使用$ 0(例如“ 1.43K”)时,下面只会使用起始数字(例如“ 1.43”)。 $ 0 =“ 1.43K”

的示例
$0 * 1024^p == 1.43K * 1024^1 == 1.43K * 1024 = 1.43 * 1024 = 1464.32
  

/ M $ / {pp(2)}

匹配以大写字母M结尾的行,调用函数pp()并将2传递给该函数(p == 2)。 $ 0 ==“ 1.203M”

$0 * 1024^p == 120.3M * 1024^2 == 120.3M * 1024^2 == 120.3M * 1024*1024 = 120.3 * 1048576 = 126143692.8

etc ... GT

  

/ [^ 0-9KMGT] $ / {打印0}

不以数字或大写字母K,M,G或T结尾的行将打印“ 0”。


示例:

$ cat dehumanise
937
1.43K
120.3M
5G
933G
12.2T
bad
<>

结果:

$ awk 'function pp(p){printf "%u\n",$0*1024^p} /[0-9]$/{print $0}/K$/{pp(1)}/M$/{pp(2)}/G$/{pp(3)}/T$/{pp(4)}/[^0-9KMGT]$/{print 0}' dehumanise
937
1464
126143692
5368709120
1001801121792
13414041858867
0
0