shell 脚本查看日志 (递归调用实现不同的位置的查找)

本文总结一下 shell  查看日志的脚本

首先在我们开发的过程中不管我们是做什么开发,java也好数据库也好都会在服务器上产生大量的日志。这些如果日志文件太大的话我们就会查看起来很困难。(想一想在几万行的日志文件中找一个关键字是不是很难受)这时候虽然有查找的命令但是还是手工操作难免手滑。

 

这个脚本主要是

1  能够按照我们要查找的关键字查找并给出上下文,打印在终端。

2 能够设置上下文的步长(递归调用实现)

3 能够按照要求答应第几次出现关键字的位置(如果出现分隔停止马上停止)

 

这里举个例子如果我们要查看的日志是这样的 关键字是 ‘hello’我们设置的步长是 10 要打印的是最后一次也就是最近一次打印的日志 1 就会得到如下结果

Test.sh logfile keyword numstep looknum   

这是我们的参数

$1 是日志文件名(默认当前路径)

$2 关键字名字

$3 步长

$4 最近出现的位置(使用递归实现)

如上图我们最近一次出现 hello关键字是在85行我们设置步长是10的话得出的结果如下

 

 

如果要打印倒数第二次出现hello的位置的话

sh test.sh a.log hello 10 2  这里把步长设置为2

 

 

结果如果图我们默认遇到 ########## 停止 

 

代码部分


#!/bin/sh


logfile=$1
keyword=$2
numstep=$3
looknum=$4

if [ $# -ne 4 ]
then 
		echo "格式错误,正确格式(test.sh logfile keyword numstep looknum) ! "
		exit
fi
function look()
{
			local up=0
			local LOCAL_N=$1
			local LOCAL_D=$2
			local LOCAL_N_SUB_1=$(($LOCAL_N - 1))  
			if [ $LOCAL_N -eq 0 ]
			then 
					#echo "轻松搞定"
					return 0
			else 
					numstep=`expr ${numstep}`
					num=`grep -n "${keyword}" ${LOCAL_D}|tail -1|awk -F ":" '{print $1}'`
					if [[ -z ${num} ]]
					then
							echo "文件中没有关键字 '${keyword}'"
							exit
					fi
					num=`expr ${num}`
					if [ ${num} -le ${numstep} ]
					then
							startnum=1 
					else
							startnum=`expr ${num} - ${numstep}` 
					fi
					endnum=`expr ${num} + ${numstep}`
					cat ${LOCAL_D} | sed -n "${startnum},${endnum}"p > /test/tmp.log    
					
					num=`grep -n "${keyword}" /test/tmp.log|tail -1|awk -F ":" '{print $1}'`
					num=`expr ${num}`
			
					
					test1=`sed -n "1,${num}"p /test/tmp.log |  grep '######'`
					if  [ "$?" -eq "0" ]
					then 
							start_finalnum=`sed -n "1,${num}"p /test/tmp.log | grep -n '######' | tail -1 | awk -F ":" '{print $1}'` 
							aaa=`sed -n "1,${num}"p /test/tmp.log | grep -n '######' | tail -1 | awk -F":" '{print $1}'`
							up=1
					else
							start_finalnum=1
					fi
					
					test=`sed -n "${num},${endnum}"p /test/tmp.log |  grep '######' `
					if [ "$?" -eq "0" ]
					then 
							end_finalnum=`sed -n "${num},${endnum}"p /test/tmp.log | grep -n '######' | head -1 | awk -F ":" '{print $1}'`
					else
							end_finalnum=`cat /test/tmp.log|wc -l`
					fi
					end_finalnum=`expr ${num} + ${end_finalnum} - 1`
					
		
					#切出来log
					if [ $up -eq 0 ]
					then
							marknum=${startnum}
					else
							marknum_tmp=`expr ${startnum} + ${aaa}`
							marknum=`expr ${marknum_tmp} - 1` 
					fi
					
					
					cat ${LOCAL_D} | sed -n "1,${marknum}"p > /test/datou_tmp.log
					cp -rf datou_tmp.log datou.log
					look $LOCAL_N_SUB_1 datou.log
			fi

}



look $looknum $logfile




sed -n "${start_finalnum},${end_finalnum}"p /test/tmp.log



#echo"${start_finalnum}----${end_finalnum}-----${end_finalnum}"
#rm tmp.log
#rm datou.log


发布了20 篇原创文章 · 获赞 2 · 访问量 9774

猜你喜欢

转载自blog.csdn.net/wangrui1605/article/details/84980047
今日推荐