Linux Shell 搜索日志文本信息,并统计,实战

下面的脚本我有一个疑问,对行tail 当取文件时,当取的内容在文件比较靠前的位置时,是不是用tail -n +num  比 tail -n num这样速度快呢??当取的内容在文件比较靠后的位置时,是不是用tail -n num比tail -n +num这样子速度更快一些呢??


经过对大文件(5.9GB+  14000000+行)测试,只有在取得的行非常靠近文件结尾时,tail -n num的速度才会达到或者超过tail -n +num的速度。


#!/usr/bin/env bash



dateMatch="^[0-9]{4}-[0-9]{2}-[0-9]{2}$"
dubboIdMatch="([0-9]{1,3}\.){3}[0-9]{1,3}-[0-9]{4}-[0-9]{13}-[0-9]{2}"


check() {
    if ! [[ $1 =~ $dateMatch ]]
    then
        echo "Usage: <cmd> yyyy-MM-dd"
        exit -1
    fi
}


check $1


bizCall_pattern="BizCall="
params_pattern="params="
old_pattern="决定支付工具.*买家没有足够积分"
new_pattern="CommonExecutor.*ServiceCheck.*CheckUserBalanceResult.*买家没有足够积分"
log_path="/home/rd/logs/trademanage/"
log_filename=$log_path"info-"$1".log"


datetime=`date +%Y%m%d%H%M%S`
old_filename=$1"_"$datetime"_oldinterface_log.txt"
new_filename=$1"_"$datetime"_newinterface_log.txt"
#touch $new_filename $old_filename


target_servers=`cat prod.servers|grep "tm" |cut -d "=" -f 2`
temp_filename_pre="temp_log"$1
temp_filename_params_pre=$temp_filename_pre"params"


for s in $target_servers
do
    total_file_len=`ssh -n rd@$s wc -l $log_filename | cut -d " " -f 1`


    temp_filename=$temp_filename_pre$s".txt"
    echo -e "\033[$(($(tput cols)/2))C\033[32;49;1m[$1-$s]\033[39;49;0m" > $temp_filename
    ssh -n rd@$s grep -E "$new_pattern" $log_filename >> $temp_filename
    temp_filename_dubboid=$temp_filename_pre"dubboid"$s".txt"
    grep -oE $dubboIdMatch $temp_filename | uniq > $temp_filename_dubboid


    temp_file_params=$temp_filename_params_pre$s".txt"
    rm -rf $temp_file_params
    touch $temp_file_params


    find_len_no=0
    remain_len_no=$total_file_len
    half_len_no=`echo "$total_file_len /  10 * 9" | bc`
    while read line
    do
        temp_find_len=0


        if [ $find_len_no -gt $half_len_no ]
        then
            remain_len_no=`echo "$total_file_len - $find_len_no" | bc`
            ssh -n rd@$s "tail -n $remain_len_no $log_filename | grep -n -m 1 -E $bizCall_pattern".*"$line".*"$params_pattern" >> $temp_file_params
        else
            ssh -n rd@$s "tail -n "+"$find_len_no $log_filename | grep -n -m 1 -E $bizCall_pattern".*"$line".*"$params_pattern" >> $temp_file_params
        fi
        temp_find_len=`tail -n 1 $temp_file_params | cut -d ":" -f 1`
        find_len_no=`echo "$temp_find_len + $find_len_no" | bc`


    done < $temp_filename_dubboid
done


grep -oE "params=\[[0-9]*, [0-9]*, [0-9]*, [0-9]*" $temp_filename_params_pre* | cut -d "[" -f 2 > userappidversion.txt
cat userappidversion.txt | cut -d "," -f 1 | sed 's/ *//g' | sort | uniq > uniquserid.txt
cat userappidversion.txt | cut -d "," -f 3 | sed 's/ *//g' > appid.txt
cat userappidversion.txt | cut -d "," -f 4 | sed 's/ *//g' > version.txt


wc -l uniquserid.txt | cut -d " " -f 1 > uniquseridnum.txt


rm -rf uniqappidnum.txt
uniqappid=`sort appid.txt | uniq`
for id in $uniqappid
do
    echo -n $id" " >> uniqappidnum.txt
    grep -E "^"$id"$" appid.txt | wc -l >> uniqappidnum.txt
done


rm -rf uniqversionnum.txt
uniqversion=`sort version.txt | uniq`
for version in $uniqversion
do
    echo -n $version" " >> uniqversionnum.txt
    grep -E "^"$version"$" version.txt | wc -l >> uniqversionnum.txt
done

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值