Chinaunix首页 | 论坛 | 博客
  • 博客访问: 845202
  • 博文数量: 63
  • 博客积分: 1317
  • 博客等级: 中尉
  • 技术积分: 686
  • 用 户 组: 普通用户
  • 注册时间: 2010-11-30 22:07
文章分类

全部博文(63)

文章存档

2015年(4)

2014年(1)

2013年(1)

2012年(2)

2011年(54)

2010年(1)

我的朋友

分类: Python/Ruby

2011-08-07 11:21:37

计算两个日期之间的天数的思路都是:先转换成时间戳,然后计算两个日期之间相差的秒数,再转换成天数。由于aix ksh无法使用date +%s -d ''进行时间戳转换,一番搜索之后,找到了一段代码可以实现ksh下的时间戳转换,特记录备用。虽不明所以,但测试可用。如有明白的达人,望赐教一二。
date2seconds()
{
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        j=j*86400+$4*3600+$5*60+$6
        print j
    }'
}

格式:date2seconds 2011 08 07 00 00 00


领导要求写一段shell代码for aix,查看文件系统空间增长情况,假定文件系统都是线形增长(非线性增长,设置阀值报警即可)。写的时候,需要计算两个日期直接的天数,利用了上面这段代码。记录之。

文件系统大小定时采集:
date=`date +%Y%m%d`
df -kv|sed 1d>tmp.size
while read dirsize
do
echo `echo $dirsize|awk '{print $NF, $3 }'` $date >>file.size
done rm -rf tmp.size

文件系统空间增长计算:

#!/usr/bin/ksh
#set -x
getdays()
{
arg1="`echo "$1"|awk '{print substr($1,0,4),substr($1,5,2),substr($1,7,2)}'` 00 00 00"
arg2="`echo "$2"|awk '{print substr($1,0,4),substr($1,5,2),substr($1,7,2)}'` 00 00 00"
stseconds=`date2seconds $arg1`
edseconds=`date2seconds $arg2`
echo "$stseconds $edseconds"|awk '{print ($2-$1)/86400 }'
}

date2seconds()
{
    echo "$*" | awk '{
        z=int((14-$2)/12); y=$1+4800-z; m=$2+12*z-3;
        j=int((153*m+2)/5)+$3+y*365+int(y/4)-int(y/100)+int(y/400)-2472633;
        j=j*86400+$4*3600+$5*60+$6
        print j
    }'
}
awk '{print $1}' file.size|sort|uniq >tmp.dir
while read dir
do
grep -w $dir file.size|sort +2 -3>tmp.tmp
stsize=`head -1 tmp.tmp|awk '{print $2}'`
stdate=`head -1 tmp.tmp|awk '{print $3}'`
edsize=`tail -1 tmp.tmp|awk '{print $2}'`
eddate=`tail -1 tmp.tmp|awk '{print $3}'`
#echo "start date:$stdate,end date:$eddate,stsize:$stsize,edsize:$edsize\n"
days=`getdays $stdate $eddate`
#echo "days:$days\n"
size=`echo "$stsize $edsize"|awk '{print $2-$1}'`
#echo "size:$size\n"
daysize=`echo "$size $days"|awk '{print $1/$2}'`
monsize=`echo "$daysize"|awk '{print ($1*30)/(1024*1024)}'`
echo "From \033[32m $stdate \033[0m to \033[32m $eddate \033[0m,\033[33m $dir \033[0m increase\033[31m $size K \033[0m in \033[33m $days days \033[0m,Average \033[35m daily \033[0m increase of \033[31m $daysize K \033[0m,Average \033[35m monthly \033[0m increase of\033[31m $monsize G \033[0m"
done
rm -rf tmp.dir
rm -rf tmp.tmp
阅读(8666) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~