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

Dev*_*von 11 linux bash awk human-readable

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

所以转换这个:

937
1.43K
120.3M
Run Code Online (Sandbox Code Playgroud)

至:

937
1464
126143693
Run Code Online (Sandbox Code Playgroud)

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

提前致谢.

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

我找到了这个,但给出的awk命令似乎无法正常工作.它输出类似534K"0"的东西.

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

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

sta*_*fry 13

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

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
} 
Run Code Online (Sandbox Code Playgroud)

例:

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

$ dehumanise 2G 2g 2GiB 2GB 
2147483648
2147483648
2147483648
2000000000
Run Code Online (Sandbox Code Playgroud)

后缀不区分大小写.


bra*_*blc 8

numfmt --from=iec从GNU coreutils 使用。


tin*_*ink 7

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
Run Code Online (Sandbox Code Playgroud)


Tho*_*ner 5

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
Run Code Online (Sandbox Code Playgroud)