zoukankan      html  css  js  c++  java
  • awk算术运算一例:统计hdfs上某段时间内的文件大小

    计算hdfs指定目录中所有文件名中包含2011-04-24的文件大小,并换算成GB: 
    $HADOOP_HOME/bin/hadoop fs -du /user/hdfs/s3/ifocus/*2011-04-24*  |awk '{sum += $1}END{print sum}'  |awk '{total=$1;base=1024*1024*1024;print total/base}'  
      如果要统计20号到24号所有文件大小的总和呢?
    #!/bin/bash 

    DIR=/log/tmp/cd 
     
    startdate="$1"
    date1=$(date -d "$1" "+%s")
    date2=$(date -d "$2" "+%s")
    date_count=$(echo "$date2 - $date1"|bc)
    day_m=$(echo "$date_count"/86400|bc)
     
    for ((sdate=0;sdate<"$day_m";sdate++))
    do
    DAY=$(date -d "$startdate $sdate days" "+%F")
       Size=$(~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -du ${DIR}/*${DAY}* |awk '{sum += $1}END{printf "%u",sum}') 
       let a=${a}+${Size} 
    done 
     
    echo $a |awk '{total=$1;base=1024*1024*1024;print total/base}' 
       脚本比较简单,但由于shell不支持浮点数运算,搞了很久,才想起使用printf "%u"来指定用十进制表示文件大小,这才顺利完成脚本。计算的时候,指定起始日期,20110420,20110424。
      另外一个问题:最后那条shell语句是如何取得for循环中的变量$a的?Shell脚本里,要使用local关键字来标识局部变量;否则,变量默认为全局的,一直到脚本结束,当然前提是没有被后面的值覆盖。
      所以,在循环体外面引用循环体里面的变量是完全可以的。

    直接在数据源上用正则表达式即可,
    $HADOOP_HOME/bin/hadoop fs -du /user/hdfs/s3/ifocus/*2011-04-2[0-4]*  |awk '{sum += $1}END{print sum}'  |awk '{total=$1;base=1024*1024*1024;print total/base}'

  • 相关阅读:
    ColorDialog 组件
    HTTP 错误 404.3
    iis服务器401.3 ACL访问权限问题
    python并发编程(进程操作)
    python并发编程(一些基本概念)
    python网络编程二
    python 网络编程
    python 异常处理
    python模块(hashlib,configparse,logging)
    python面向对象进阶
  • 原文地址:https://www.cnblogs.com/dyllove98/p/3239213.html
Copyright © 2011-2022 走看看