想要从du -h命令获取第一个字段的小数部分。所以字段分隔符应该是字符K或字符M.我尝试了多个选项-F并且它不起作用。
du -h AWSD.????.20121123.????.LBB4.????.*.gz |
tr -s ' ' |
awk -F'K|M' 'BEGIN{x=0;} {print $1;} END{print x;}
答案 0 :(得分:1)
您似乎正在寻找使用K
或M
作为字段分隔符的awk解决方案。您的解决方案几乎是正确的,如果您将KM
括起来作为一个字符类,它将会起作用:
du -h | awk -F '[KM]' '{ print $1 }'
现在,在原始问题中,您还想要总使用量。在这种情况下,删除K
或M
字符是不正确的 - 在这种情况下,最好使用df -k
并仅使用第1列:
$ du -k | awk '{ sum+=$1 } END { print sum, "k" }'
52939620 k
$ du -k | awk '{ sum+=$1*1024 } END { print sum/1e6, "x 1e6 bytes" }'
54210.2 x 1e6 bytes
$ du -k | awk '{ sum+=$1*1024 } END { print sum/1e9, "x 1e9 bytes" }'
54.2102 x 1e9 bytes
请注意此代码如何避免讨论MebiBytes与MegaBytes。
注意2:但是,此代码会再次为每个父目录计算子目录。
在Solaris系统上,将-o
添加到du -k
以防止此情况发生。
答案 1 :(得分:0)
我认为你想要的是第一个领域:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1
或没有单位的第一个字段:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1 | sed 's/[GMK]$//'
或者获取第一个字段的整数部分:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | sed 's/\([0-9]*\).*/\1/'
答案 2 :(得分:0)
一个简单的答案是使用内置类型转换(nawk / gawk):
du -h | nawk '{print $1+0}'
通过添加零将字段转换为数字类型,简单地忽略不属于数字的尾随字符。 (虽然你应该理解什么被接受为数字,例如像“123e10”这样的输入将被视为123x10 ^ 10。)
使用FS的一个缺点是,恢复哪个分隔符的唯一方法是检查$ 0。类似的东西:
if ( match($1,/([0-9.]+)([KMGT])/,bb) ) {
...
}
将是我的建议(gawk> = 3.1.0)。
如果处理大数字,可能需要使用printf(),或修改默认的数字输出格式(OFMT变量),而不仅仅是“打印”。 我早就放弃了解析ls / df / du等平台相关输出,使用GNU stat(coreutils)在我的经验中更加强大。