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