Shell学习总结。
最近在学习shell,用shell 做一些统计分析的工作。基本上是从0开始学起,所以遇到了很多的问题,有时候一个下午都找不到错误的地方。
今天做个总结,以后好作为备用。
第一个shell脚本
我的第一个shell脚本,实现的功能是输入一个包含站点的文件,然后从一个日志文件中抽取出包含这个站点的信息输出到另外一个文件,同时记录输出文件的行数。
难点: 从文件中读取一个站点的时候需要过滤掉末尾的换行符,使用的是:
LINENEW=`echo $LINE |sed 's//r//g'`
输出结果追加使用>>符号。
#!/bin/sh
if [ $# != 2 ]; then
echo "please input 2 paremeter ,first is site ,the other one is log "
else
SITES=$1
LOGS=$2
fi
rm siteout.txt
while read LINE
do
echo $LINE
LINENEW=`echo $LINE |sed 's//r//g'`
echo $LINENEW
echo "************"
` rm ./out/$LINENEW`
`grep "$LINENEW" $LOGS > ./out/$LINENEW`
` echo $LINENEW = >>siteout.txt `
`cat ./out/$LINENEW | wc -l >> siteout.txt `
done < $SITES
第二个脚本(sitetime.sh)
读入需要统计站点的站点名,日期,开始时间,结束时间。
日期的格式是YYYY-MM-DD
时间的格式是 HH-MM-SS
然后在文件中抽取出满足条件的内容。
难点: 文件中日期的转换和比较
首先得到 小时,然后得到分,然后得到秒,
HOURSB=`echo $TIMETMP|awk '{print $1}'`
MINSB=`echo $TIMETMP|awk '{print $2}'`
SECSB=`echo $TIMETMP|awk '{print $3}'`
然后通过计算:
TIMEB1=`expr $HOURSB /* 3600 + $MINSB /* 60 + $SECSB`
得到这样一个时间,
再对文本中的时间进行计算,最后进行比较
难点:shell向awk传参数
`awk -v a=$DAYS '{ if ($4==a || $5==a) print $0 }' ../gao/* > ./tmp1/$SITES$DAYS$TIMEB$TIMEE`
#!/bin/sh
if [ $# != 4 ]; then
echo "please input 4 paremeter : site day timebegin timeend "
else
SITES=$1
DAYS=$2
TIMEB=$3
TIMEE=$4
TIMETMP=`echo $TIMEB|sed 's//:/ /g'`
#得到开始时间
HOURSB=`echo $TIMETMP|awk '{print $1}'`
MINSB=`echo $TIMETMP|awk '{print $2}'`
SECSB=`echo $TIMETMP|awk '{print $3}'`
echo $TIMETMP
echo $HOURSB
echo $MINSB
echo $SECSB
TIMEB1=`expr $HOURSB /* 3600 + $MINSB /* 60 + $SECSB`
echo $TIMEB1
#得到结束时间
TIMETMP=`echo $TIMEE|sed 's//:/ /g'`
echo $TIMETMP
HOURSE=`echo $TIMETMP|awk '{print $1}'`
MINSE=`echo $TIMETMP|awk '{print $2}'`
SECSE=`echo $TIMETMP|awk '{print $3}'`
TIMEE1=`expr $HOURSE /* 3600 + $MINSE /* 60 + $SECSE`
echo $TIMEE1
fi
echo "come to awk "
#将满足一定数据的输出到文件,然后再抓取第二个参数,在输出到另一个文件
`awk -v a=$DAYS '{ if ($4==a || $5==a) print $0 }' ../gao/* > ./tmp1/$SITES$DAYS$TIMEB$TIMEE`
echo "come to grep "
`grep "$SITES" ./tmp1/$SITES$DAYS$TIMEB$TIMEE > ./tmp/$SITES$DAYS$TIMEB$TIMEE`
while read LINE
do
# echo $LINE
#得到日期
TIMETMP=`echo $LINE| awk '{print $6}'|sed 's//:/ /g'`
echo $TIMETMP
HOURS=`echo $TIMETMP|awk '{print $1}'`
echo $HOURS
MINS=`echo $TIMETMP|awk '{print $2}'`
echo $MINS
SECS=`echo $TIMETMP|awk '{print $3}'`
echo $SECS
TIMESNOW=`expr $HOURS /* 3600 + $MINS /* 60 + $SECS`
echo $TIMESNOW
#比较日期是否满足条件
if [ "$TIMESNOW" -le "$TIMEE1" ] ; then
if [ "$TIMESNOW" -ge "$TIMEB1" ] ; then
`echo $LINE >> ./out/$SITES$DAYS$TIMEB$TIMEE.txt `
fi
fi
done < ./tmp/$SITES$DAYS$TIMEB$TIMEE
#输出结果
# `echo "$SITES $DAYS $TIMEB $TIMEE = " >>./fout/$SITES$DAYS$TIMEB$TIMEE`
OUTS=`cat ./out/$SITES$DAYS$TIMEB$TIMEE.txt | wc -l `
`echo "$SITES $DAYS $TIMEB $TIMEE = [ $OUTS ]" >>./fout/$SITES`
` rm ./tmp1/$SITES$DAYS$TIMEB$TIMEE`
` rm ./tmp/$SITES$DAYS$TIMEB$TIMEE`
`rm ./out/$SITES$DAYS$TIMEB$TIMEE.txt`
第三个脚本(all.sh)
针对文件中的每一行调用上面的脚本
#!/bin/sh
if [ $# -lt 1 ] ; then
echo "usage :please input the file "
fi
FINENAME=$1
while read LINE
do
echo $LINE
SITE=`echo $LINE|awk '{print $1}'`
DAY=`echo $LINE|awk '{print $2}'`
TIMEB=`echo $LINE|awk '{print $3}'`
TIMEE=`echo $LINE|awk '{print $4}'`
echo "./sitetime.sh $SITE $DAY $TIMEB $TIMEE"
./sitetime.sh $SITE $DAY $TIMEB $TIMEE
done < $FINENAME
第四个脚本(runall.sh)
根据模板生成每个站点的文件,然后依此调用all.sh来完成统计
难点:
Shell参数传递给sed:
`sed -e 's/3g.sina.com.cn/'"$LINENEW"'/g' siteneeds.txt > ./sitetemplate/$LINENEW`
#!/bin/sh
if [ $# -lt 1 ] ; then
echo "usage :please input the file "
fi
FINENAME=$1
while read LINE
do
echo $LINE
LINENEW=`echo $LINE |sed 's//r//g'`
`sed -e 's/3g.sina.com.cn/'"$LINENEW"'/g' siteneeds.txt > ./sitetemplate/$LINENEW`
echo "run ........"
./all.sh ./sitetemplate/$LINENEW
done < $FINENAME
乱哄哄的写了一堆,以后可以查看一下哦,
O(∩_∩)O~,我的记事本。