所以我试图在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
答案 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 ... G
和T
/ [^ 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