不得不服中国移动客户的严谨。在配置Weblogic集群中我们系统与N个第三方系统交互的线程队列的大小时,他们要我们跟据现网日志分析各系统的请求压力,而且要拿出各种统计数据,然后根据这样统计数据来决点各线程池的大小。俺们系统日志,N多种,一天产生的量基本都是几十万级的,加起来过千万。所以,写这个Shell方便分析,觉得这个Shell还算通用,所以发布上来,希户能给后来者也带来方便。


这个Shell是用来统计某日志文件中,特定日期,一天24小时所接受的请求数量的。


它同时接收三个参数(当然,你也可以HardCode):


第一个参数:日志文件名


第二个参数:特定日期(可以有多个,日期之间以空格隔开)


第三个参数:关键字(也可以有多个,关键字之间以空格隔开)



比如,要以Login与ServiceID为关键字,统计biz.log中2008-03-06与2008-03-08各时段接受的请求数量,可执行:


sh analyse.sh "biz.log" "2008-03-06 2008-03-08" "Login ServiceID"
 
 
analyse.sh:
 
 
  
pfile 
  = 
  $ 
  1 
  ;
pdates 
  = 
  $ 
  2 
  ;
pkeywds 
  = 
  $ 
  3 
  ;
keywd 
  = 
  "" 
  ;
method_count()
{
    
  echo 
    
  " 
  Begin method method_count! 
  " 
  $keywd 
  ;
   hs 
  = 
  " 
  00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 
  " 
  ;
     
  for 
   dt in  
  $pdates 
  ;
     
  do 
  
      
  for 
   h in  
  $hs 
  ;
      
  do 
  
       tt 
  = 
  $dt 
  " 
  . 
  " 
  $h 
  ;
       kk 
  = 
  $tt 
  " 
  {1,}.* 
  " 
  $keywd 
  ;
        
  echo 
    
  $dt 
  " 
  日 
  " 
  $h 
  " 
  时的请求数: 
  " 
  ;
        
  # 
   echo $kk; 
  
 
          
  # 
  cat $pfile|grep $dt"."$h|grep $keywd|wc -l; 
  
 
         grep  
  $kk 
    
  $pfile 
  | 
  wc  
  - 
  l;
      
  done 
  ;
     
  done 
  ;
    
  echo 
    
  " 
  End method method_count! 
  " 
  ;
}
 
  for 
   k in  
  $pkeywds 
  ;
 
  do 
  
 
  # 
    if [ -n "$keywd" ]; 
  
# 
    then  
  
# 
       echo JJJJJ $keywd; 
  
# 
       keywd=$keywd"|"; 
  
# 
    fi 
  
 
    keywd 
  = 
  $keywd$k 
  " 
  {1,}.* 
  " 
  ;
 
  done 
  ;
method_count;


 注意:上面Shell中的“}”与“{”请分别改为“/}”、“/{”。我代码中的"/"转义符,让CSDN系统去掉了。毫无疑问,这是CSDN的一个BUG。

执行结果:

Begin method method_count!Login/{1,/}.*ServiceID/{1,/}.*
2008-03-06ÈÕ00ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ01ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ02ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ03ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ04ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ05ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ06ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ07ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ08ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ09ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ10ʱµÄÇëÇóÊý£º
      1
2008-03-06ÈÕ11ʱµÄÇëÇóÊý£º
      2
2008-03-06ÈÕ12ʱµÄÇëÇóÊý£º
      1
2008-03-06ÈÕ13ʱµÄÇëÇóÊý£º
      1
2008-03-06ÈÕ14ʱµÄÇëÇóÊý£º
      1
2008-03-06ÈÕ15ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ16ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ17ʱµÄÇëÇóÊý£º
    280
2008-03-06ÈÕ18ʱµÄÇëÇóÊý£º
      1
2008-03-06ÈÕ19ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ20ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ21ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ22ʱµÄÇëÇóÊý£º
      0
2008-03-06ÈÕ23ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ00ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ01ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ02ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ03ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ04ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ05ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ06ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ07ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ08ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ09ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ10ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ11ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ12ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ13ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ14ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ15ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ16ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ17ʱµÄÇëÇóÊý£º
      3
2008-03-08ÈÕ18ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ19ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ20ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ21ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ22ʱµÄÇëÇóÊý£º
      0
2008-03-08ÈÕ23ʱµÄÇëÇóÊý£º
      0
End method method_count!

后一次完善:


在原来三个参数的基础上增为四个参数:


第一个参数:日志文件名


第二个参数:特定日期(可以有多个,日期之间以空格隔开)


第三个参数:关键字(也可以有多个,关键字之间以空格隔开)


第四个参数:目录的路径(注意不能以“/”结束,如“/home”不能写成“/home/”。如果不填此参数,则默认为当前目录)



如/home目录下有日志文件biz.log.2008-03-06-03.bak、biz.log.2008-03-06-01.bak、biz.log.2008-03-06-02.bak,


要以Login ServiceID为关键字查看这些文件中2008-03-06与2008-03-08各时段接受的请求数量,可执行:


sh analyse3.sh "biz.log.2008-03-06" "2008-03-06 2008-03-08" "Login ServiceID" "/home"



建议用另一个Shell来引用此Shell,并输出到后台文件中,这样可以达到达到批处理的目的



analyse3.sh



linux按照时间查询Java log日志_login

pfile =

$ 1 ;

linux按照时间查询Java log日志_login

pdates =

$ 2 ;

linux按照时间查询Java log日志_login

pkeywds =

$ 3 ;

linux按照时间查询Java log日志_login

ppath =

$ 4 ;

linux按照时间查询Java log日志_login

keywd =

"" ;

linux按照时间查询Java log日志_login

tempf =

" _temp_all.log " ;

linux按照时间查询Java log日志_login

method_count()

linux按照时间查询Java log日志_login

{

linux按照时间查询Java log日志_login

   hs =

" 00 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 " ;

linux按照时间查询Java log日志_login

     for

 dt in  $pdates ;

linux按照时间查询Java log日志_login

     do


linux按照时间查询Java log日志_login

      for

 h in  $hs ;

linux按照时间查询Java log日志_login

      do


linux按照时间查询Java log日志_login

      tt =

$dt " . " $h ;

linux按照时间查询Java log日志_login

      kk =

$tt " {1,}.* " $keywd ;

linux按照时间查询Java log日志_login

       echo

  $pfile   $dt " 日 " $h " 时的请求数: " ;

linux按照时间查询Java log日志_login

      grep  $kk

  $tempf | wc  - l;

linux按照时间查询Java log日志_login

      done

;

linux按照时间查询Java log日志_login

     done

;

linux按照时间查询Java log日志_login

}

linux按照时间查询Java log日志_login


linux按照时间查询Java log日志_login

method_createtempfile()

linux按照时间查询Java log日志_login

{

linux按照时间查询Java log日志_login

   mf =

"" ;

linux按照时间查询Java log日志_login

    for

 ff in  $ppath /* ;

linux按照时间查询Java log日志_login

   do

linux按照时间查询Java log日志_login

     if [ -f $ff ];

linux按照时间查询Java log日志_login

     then

linux按照时间查询Java log日志_login

       case $ff in *$pfile*)

linux按照时间查询Java log日志_login

           mf=$mf" "$ff;

linux按照时间查询Java log日志_login

       esac

linux按照时间查询Java log日志_login

     fi   

linux按照时间查询Java log日志_login

   done;

linux按照时间查询Java log日志_login

   cat $mf > $tempf;

linux按照时间查询Java log日志_login

}

linux按照时间查询Java log日志_login


linux按照时间查询Java log日志_login

for k in $pkeywds;

linux按照时间查询Java log日志_login

do

linux按照时间查询Java log日志_login

  keywd=$keywd$k"{1,}.*";

linux按照时间查询Java log日志_login

done;

linux按照时间查询Java log日志_login


linux按照时间查询Java log日志_login

if [ -z $ppath ];

linux按照时间查询Java log日志_login

then

linux按照时间查询Java log日志_login

  ppath=".";

linux按照时间查询Java log日志_login

fi

linux按照时间查询Java log日志_login

echo begin analyse! keyword is $keywd 

linux按照时间查询Java log日志_login

method_createtempfile;

linux按照时间查询Java log日志_login

method_count;

linux按照时间查询Java log日志_login

rm $tempf;

linux按照时间查询Java log日志_login

echo end analyse!

linux按照时间查询Java log日志_login