下面的脚本我有一个疑问,对行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