想要从 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;}
您似乎正在寻找一种 awk 解决方案,该解决方案将使用K
或M
用作字段分隔符。您的解决方案几乎是正确的,如果您将其封装KM
为字符类,它将起作用:
du -h | awk -F '[KM]' '{ print $1 }'
现在,在最初的问题中,您还想要总使用量。在这种情况下,删除K
orM
字符是不正确的 - 在这种情况下,最好使用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
todu -k
以防止这种情况。
我认为您想要的是第一个字段:
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/'
一个简单的答案是使用内置类型转换(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) 更加健壮。