写了一个从服务器上拉日志的脚本,
从多台服务器上拉日志,日志名称是相同的,且每天有两个日志文件生成,如每台服务器上都有如下两个文件:ok_2011-04-24_24H.rar,ok_2011-04-24_12H.rar。显然不能把所有日志放到同一目录中进行处理,而且要同时解压两个文件后才能进行下一步处理,我想到了使用awk打印出相应命令,然后再执行。
- #!/bin/bash
- #2011-04-25 by qinshan.li
- #download the track log
- #
- DIR="22 33 45 46 47 135 136 137"
- DAY=$(/bin/date +%F)
- #DAY=$(echo $1)
- for P in $DIR; do
- [[ -d "/lzo/jiaxing/track/$P" ]] || /bin/mkdir -p /lzo/jiaxing/track/$P
- MULU=/lzo/jiaxing/track/$P
- #Download the rar files.
- /usr/bin/wget -nc -r --exclude-directories=tmplog -nd -np -A "ok_${DAY}_*.rar" -P $MULU http://10.10.17.66:8003/"$P"/track/
- #Create directory to save the decompressed rar files.
- n=$(/bin/ls $MULU/*.rar 2>/dev/null |/usr/bin/wc -l)
- if [[ "$n" != "0" ]]
- then
- [[ -d $MULU/$DAY ]] || /bin/mkdir -p $MULU/$DAY
- /usr/bin/find $MULU -name "*${DAY}*.rar" |/bin/awk '{printf "/usr/local/bin/rar e %s %s/%s\n",$1,"'$MULU'","'$DAY'"}' |/bin/sh >/dev/null
- if [[ "$?" = "0" ]]
- then
- if /bin/cat $MULU/$DAY/*.* >>$MULU/66_icast_"$P"_"$DAY".txt
- then
- if /usr/local/bin/lzop -U -9 $MULU/66_icast_"$P"_"$DAY".txt
- then
- if /usr/local/bin/lzop -t $MULU/66_icast_"$P"_"$DAY".txt.lzo
- then
- ~/hadoop-0.20.2-CDH3B4/bin/hadoop fs -moveFromLocal $MULU/66_icast_"$P"_"$DAY".txt.lzo /log/source/iCast_iFocus_track
- if [[ "$?" = "0" ]]
- then
- rm -rf $MULU/* >/dev/null 2>&1
- fi
- fi
- fi
- fi
- fi
- fi
- done
这个脚本没有再使用wget的-N参数,因为同事告诉我,这里的日志虽然是以HTTP方式提供,但时间戳标记是关闭的,所以-N参数是没有用的。
添加了-nc参数,wget会忽略已经下载过的文件,当然,这可能会导致一个问题,就是该文件在上次下载后已经更新,但wget仍然会忽略它,不过这种情况非常少见。
这次也没有再使用awk的substr函数来提取字段,是因为这次R 目录长度不同,不如直接使用$MULU和$DAY方便。要说明的是,$MULU这个变量,原来写的是$PATH,但是后来在执行hadoop的fs命令进行上传操作时,报了错误,它把$PATH变量解释成了环境变量的$PATH!看来,在设置自定义变量时要慎之又慎啊!
本文转自 li_qinshan 51CTO博客,原文链接:http://blog.51cto.com/share/554160