想要从du -h命令获取第一个字段的小数部分。所以字段分隔符应该是字符K或字符M.我用-F尝试了多个选项,但它不起作用。关于awk字段分隔符
du -h AWSD.????.20121123.????.LBB4.????.*.gz |
tr -s ' ' |
awk -F'K|M' 'BEGIN{x=0;} {print $1;} END{print x;}
想要从du -h命令获取第一个字段的小数部分。所以字段分隔符应该是字符K或字符M.我用-F尝试了多个选项,但它不起作用。关于awk字段分隔符
du -h AWSD.????.20121123.????.LBB4.????.*.gz |
tr -s ' ' |
awk -F'K|M' 'BEGIN{x=0;} {print $1;} END{print x;}
您似乎在寻找将使用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 VS兆字节的讨论。
注2:然而,此代码对每个父目录再次计算子目录。 在Solaris系统上,将-o
添加到du -k
以防止发生此情况。
我尝试了下面的一个。它不工作。在solaris中运行10.在F分隔符都不工作后,我尝试了一个空格并且没有空格。 du -h AWSD.????.20121123.????.LBB4.????.*.gz | tr -s''| awk -F'[KM]''{print $ 1; }' – Arav
在Solaris上,使用'nawk'而不是'awk'。另请参阅请参阅关于'du -ko'的注释。 –
我想你想要什么是第一场:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1 | sed 's/[GMK]$//'
或获得第一的整数部分:
du -h AWSD.????.20121123.????.LBB4.????.*.gz | cut -f1
还是第一次没有单位字段字段:
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)更符合我的经验。
你究竟想在这里完成什么?你的预期产出是多少? – Steve
我只想要du -h的第一个字段的单元部分。我想使用awk来完成总使用量的总和。 – Arav
发布du命令的输出和awk命令的输出,以便每个人都可以停止猜测。 –