最近一個哥們的需求是對日志里面的數(shù)據(jù)做一下監(jiān)控,要求是日志里面的某個字段的值,并求這一值得最大最小值微峰。
日志樣例:
10:46:13.840 [Thread-11] WARN c.c.b.s.s.c.Status - TPS=137504, delay=7,40023ms, avgTPS=137536, avgDelay=7,400194ms, objs=137536, totalTime=1s
10:46:14.840 [Thread-10] WARN c.c.b.s.s.c.Status - TPS=138896, delay=7,31168ms, avgTPS=138304, avgDelay=7,355904ms, objs=276640, totalTime=2s
10:46:15.840 [Thread-12] WARN c.c.b.s.s.c.Status - TPS=139904, delay=7,26450ms, avgTPS=138864, avgDelay=7,326106ms, objs=416592, totalTime=3s
10:46:16.840 [Thread-12] WARN c.c.b.s.s.c.Status - TPS=143504, delay=7,08871ms, avgTPS=140044, avgDelay=7,265344ms, objs=560176, totalTime=4s
10:46:17.840 [Thread-12] WARN c.c.b.s.s.c.Status - TPS=143776, delay=7,07661ms, avgTPS=140790, avgDelay=7,226796ms, objs=703952, totalTime=5s
10:46:18.840 [Thread-12] WARN c.c.b.s.s.c.Status - TPS=143376, delay=7,09954ms, avgTPS=141224, avgDelay=7,205253ms, objs=847344, totalTime=6s
需要獲得得是avgDelay這一列的數(shù)值
首先需要做字符串匹配
line=`echo ${line#*=}`
line=`echo ${line%m*}`
line=`echo ${line/,/.}`
上面的含義是:
- echo ${line#*=} # 號是運算符 *= 表示從左邊開始刪除第一個 = 號及左邊的所有字符
- echo ${line%m} %號是運算符 m 表示從右邊開始,刪除第一個 m 號及右邊的字符
- echo ${line/,/.} /表示單詞匹配,號 用.號代替
其他的相關(guān)符號使用可見下
>假設(shè)有變量 var=http://www.aaa.com/123.htm.
>
>1. # 號截取,刪除左邊字符锄蹂,保留右邊字符。
>
>echo ${var#*//}
> 其中 var 是變量名峰档,# 號是運算符败匹,*// 表示從左邊開始刪除第一個 // 號及左邊的所有字符
>即刪除 http://
>結(jié)果是 :www.aaa.com/123.htm
>
>2. ## 號截取,刪除左邊字符讥巡,保留右邊字符掀亩。
>
>echo ${var##*/}
>
>
>##*/ 表示從左邊開始刪除最后(最右邊)一個 / 號及左邊的所有字符
>即刪除 http://www.aaa.com/
>
>結(jié)果是 123.htm
>
>3. %號截取,刪除右邊字符欢顷,保留左邊字符
>
>echo ${var%/*}
>
>
>%/* 表示從右邊開始槽棍,刪除第一個 / 號及右邊的字符
>
>結(jié)果是:http://www.aaa.com
>
>4. %% 號截取,刪除右邊字符抬驴,保留左邊字符
>
>echo ${var%%/*}
> %%/* 表示從右邊開始炼七,刪除最后(最左邊)一個 / 號及右邊的字符
>結(jié)果是:http:
>
>5. 從左邊第幾個字符開始,及字符的個數(shù)
>
>echo ${var:0:5}
>
>
>其中的 0 表示左邊第一個字符開始布持,5 表示字符的總個數(shù)豌拙。
>結(jié)果是:http:
>
>6. 從左邊第幾個字符開始,一直到結(jié)束题暖。
>
>echo ${var:7}
>
>
>其中的 7 表示左邊第8個字符開始按傅,一直到結(jié)束。
>結(jié)果是 :www.aaa.com/123.htm
>
>7. 從右邊第幾個字符開始胧卤,及字符的個數(shù)
>
>echo ${var:0-7:3}
>
>
>其中的 0-7 表示右邊算起第七個字符開始唯绍,3 表示字符的個數(shù)。
>結(jié)果是:123
>
>8. 從右邊第幾個字符開始枝誊,一直到結(jié)束况芒。
>
>echo ${var:0-7}
>
>
>表示從右邊第七個字符開始,一直到結(jié)束叶撒。
>結(jié)果是:123.htm
>
>注:(左邊的第一個字符是用 0 表示绝骚,右邊的第一個字符用 0-1 表示)
> 一個替換的例子:
str="apple, tree, apple tree"
echo ${str/apple/APPLE} # 替換第一次出現(xiàn)的apple
echo ${str//apple/APPLE} # 替換所有apple
echo ${str/#apple/APPLE} # 如果字符串str以apple開頭耐版,則用APPLE替換它
echo ${str/%apple/APPLE} # 如果字符串str以apple結(jié)尾,則用APPLE替換它
故讀取文件并匹配替換的代碼如下:
#獲取文件名
logpath=$1
echo "raw data:"
for line in `cat $logpath`
do
#匹配avgDelay字符串
if [[ ${line} == *"avgDelay"* ]];then
#截取數(shù)字并處理
line=`echo ${line#*=}`
line=`echo ${line%m*}`
line=`echo ${line/,/.}`
echo $line >> logmidfile.txt
fi
done
對于排序 Linux許多發(fā)行版提供sort命令以行為單位對文本進行排序
一個以數(shù)字進行排序的例子:sort -n sort.txt
# sort.txt1 mac 2000
3 winxp 4000
2 linux 1000
4 win7 1000
2 linux 1000結(jié)果:
1 mac 2000
2 linux 1000
2 linux 1000
3 winxp 4000
4 win7 1000
故全部實現(xiàn)代碼如下:
#!/bin/bash
###################################################################
#*名稱 --%@NAME:日志收集排序
#*功能描述 --%@COMMENT:
#*執(zhí)行周期 --%@PERIOD:
#*參數(shù) --%@PARAM:v_hour 帳期 YYYYMMDDHH
#*參數(shù) --%@PARAM:logpath 日志路徑
#*創(chuàng)建人 --%@CREATOR:
#*創(chuàng)建時間 --%@CREATED_TIME:2019-07-31
#*層次 --%@LEVEL:
#*備注 --%@REMARK:
#*修改記錄 --%@MODIFY:
####################################################################
#參數(shù)要求皮壁,一共需要1個參數(shù)
if [ "$#" -ne "1" ]; then
echo "必須是1個參數(shù)logpath"
exit 1
fi
#獲取文件名
logpath=$1
#刪除中間文件
rm -rf logmidfile.txt
echo "raw data:"
for line in `cat $logpath`
do
#匹配avgDelay字符串
if [[ ${line} == *"avgDelay"* ]];then
#截取數(shù)字并處理
line=`echo ${line#*=}`
line=`echo ${line%m*}`
line=`echo ${line/,/.}`
echo $line >> logmidfile.txt
fi
done
#創(chuàng)建數(shù)組
array=(0)
#創(chuàng)建計數(shù)標(biāo)識
le=0
#排序文件
sort logmidfile.txt -n
echo "sort is done:"
for line2 in `cat logmidfile.txt`
do
echo $line2
array[le]=$line2
le=`expr $le + 1` #標(biāo)識++
done
echo "max:${array[0]} min:${array[(($le-1))]}"
#刪除中間文件
rm -rf logmidfile.txt
參考資料:
https://www.cnblogs.com/delav/p/9956819.html
https://www.cnblogs.com/gaochsh/p/6901809.html
https://www.linuxidc.com/Linux/2019-05/158678.htm
https://www.cnblogs.com/zwgblog/p/6031256.html
https://www.cnblogs.com/gaochsh/p/6901809.html