shell 字符串處理和數(shù)值排序

最近一個哥們的需求是對日志里面的數(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/,/.}`

上面的含義是:

  1. echo ${line#*=} # 號是運算符 *= 表示從左邊開始刪除第一個 = 號及左邊的所有字符
  2. echo ${line%m} %號是運算符 m 表示從右邊開始,刪除第一個 m 號及右邊的字符
  3. 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.txt

1 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

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末椭更,一起剝皮案震驚了整個濱河市,隨后出現(xiàn)的幾起案子蛾魄,更是在濱河造成了極大的恐慌虑瀑,老刑警劉巖,帶你破解...
    沈念sama閱讀 222,627評論 6 517
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件滴须,死亡現(xiàn)場離奇詭異舌狗,居然都是意外死亡,警方通過查閱死者的電腦和手機扔水,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 95,180評論 3 399
  • 文/潘曉璐 我一進店門痛侍,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人魔市,你說我怎么就攤上這事主届。” “怎么了待德?”我有些...
    開封第一講書人閱讀 169,346評論 0 362
  • 文/不壞的土叔 我叫張陵君丁,是天一觀的道長。 經(jīng)常有香客問我将宪,道長绘闷,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 60,097評論 1 300
  • 正文 為了忘掉前任较坛,我火速辦了婚禮印蔗,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘丑勤。我一直安慰自己华嘹,他們只是感情好,可當(dāng)我...
    茶點故事閱讀 69,100評論 6 398
  • 文/花漫 我一把揭開白布法竞。 她就那樣靜靜地躺著除呵,像睡著了一般。 火紅的嫁衣襯著肌膚如雪爪喘。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 52,696評論 1 312
  • 那天纠拔,我揣著相機與錄音秉剑,去河邊找鬼。 笑死稠诲,一個胖子當(dāng)著我的面吹牛侦鹏,可吹牛的內(nèi)容都是我干的诡曙。 我是一名探鬼主播,決...
    沈念sama閱讀 41,165評論 3 422
  • 文/蒼蘭香墨 我猛地睜開眼略水,長吁一口氣:“原來是場噩夢啊……” “哼价卤!你這毒婦竟也來了?” 一聲冷哼從身側(cè)響起渊涝,我...
    開封第一講書人閱讀 40,108評論 0 277
  • 序言:老撾萬榮一對情侶失蹤慎璧,失蹤者是張志新(化名)和其女友劉穎,沒想到半個月后跨释,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體胸私,經(jīng)...
    沈念sama閱讀 46,646評論 1 319
  • 正文 獨居荒郊野嶺守林人離奇死亡,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 38,709評論 3 342
  • 正文 我和宋清朗相戀三年鳖谈,在試婚紗的時候發(fā)現(xiàn)自己被綠了岁疼。 大學(xué)時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點故事閱讀 40,861評論 1 353
  • 序言:一個原本活蹦亂跳的男人離奇死亡缆娃,死狀恐怖捷绒,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情贯要,我是刑警寧澤暖侨,帶...
    沈念sama閱讀 36,527評論 5 351
  • 正文 年R本政府宣布,位于F島的核電站郭毕,受9級特大地震影響它碎,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜显押,卻給世界環(huán)境...
    茶點故事閱讀 42,196評論 3 336
  • 文/蒙蒙 一扳肛、第九天 我趴在偏房一處隱蔽的房頂上張望。 院中可真熱鬧乘碑,春花似錦挖息、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 32,698評論 0 25
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至资铡,卻和暖如春电禀,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背笤休。 一陣腳步聲響...
    開封第一講書人閱讀 33,804評論 1 274
  • 我被黑心中介騙來泰國打工尖飞, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人。 一個月前我還...
    沈念sama閱讀 49,287評論 3 379
  • 正文 我出身青樓政基,卻偏偏與公主長得像贞铣,于是被迫代替她去往敵國和親。 傳聞我的和親對象是個殘疾皇子沮明,可洞房花燭夜當(dāng)晚...
    茶點故事閱讀 45,860評論 2 361