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
如果看不懂代码的话,欢迎评论,我会写的再详细点。