-2

想要从 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;}  
4

3 回答 3

1

您似乎正在寻找一种 awk 解决方案,该解决方案将使用KM用作字段分隔符。您的解决方案几乎是正确的,如果您将其封装KM为字符类,它将起作用:

du -h | awk -F '[KM]' '{ print $1 }'

现在,在最初的问题中,您还想要总使用量。在这种情况下,删除KorM字符是不正确的 - 在这种情况下,最好使用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 系统上,添加-otodu -k以防止这种情况。

于 2013-01-07T02:57:27.197 回答
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/'
于 2013-01-07T01:46:57.370 回答
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) 更加健壮。

于 2013-01-07T15:51:40.287 回答