2013-01-07 81 views
-2

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

你究竟想在这里完成什么?你的预期产出是多少? – Steve

+0

我只想要du -h的第一个字段的单元部分。我想使用awk来完成总使用量的总和。 – Arav

+1

发布du命令的输出和awk命令的输出,以便每个人都可以停止猜测。 –

回答

1

您似乎在寻找将使用KM作为字段分隔符的awk解决方案。您的解决方案几乎是正确的,如果你附上KM作为一个字符类将工作:

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

现在,在原来的问题,你也想总使用量。在这种情况下,这是不正确的降KM字符 - 这是在这种情况下,最好使用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以防止发生此情况。

+0

我尝试了下面的一个。它不工作。在solaris中运行10.在F分隔符都不工作后,我尝试了一个空格并且没有空格。 du -h AWSD.????.20121123.????.LBB4.????.*.gz | tr -s''| awk -F'[KM]''{print $ 1; }' – Arav

+0

在Solaris上,使用'nawk'而不是'awk'。另请参阅请参阅关于'du -ko'的注释。 –

0

我想你想要什么是第一场:

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/' 
+0

非常感谢。如何使用模式匹配在awk的字段分隔符中跳过K或M. – Arav

+0

下面的代码会生成空的output.du -h AWSD.????.20121123.????.LBB4.????.*.gz | sed's/\([0-9] * \)。*/\ 1 /' – Arav

+0

是你在'sed's/\([0-9] * \)中包含转义符(反斜杠) \ 1 /''? – perreal

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)更符合我的经验。