关于awk字段分隔符

时间:2013-01-07 01:37:42

标签: shell unix awk

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

3 个答案:

答案 0 :(得分: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与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)在我的经验中更加强大。