在線上分析應(yīng)用日志時貌虾,常常需要統(tǒng)計分析该押,以便可以盡快的定位到問題。bash提供了awk和sed命令往衷,可以方便的進行文本處理钞翔。
awk
awk是一個強大的文本分析工具,主要用于處理行處理席舍,并且可以完成分析統(tǒng)計布轿。 它有很多內(nèi)建的功能,比如數(shù)組俺亮、函數(shù)等驮捍。靈活性很強。 適于把一行分為多個字段來處理脚曾。
主要語法:
awk [ -F fs ] [ -v var=value ] [ 'prog' | -f progfile ] [ file ...? ]
-F 分隔符东且,默認是空格”炯ィ可以通過-F指定
可以指定file珊泳,也可以讀取前個指令的standard output
awk的內(nèi)建變量
NF:每一行 ($0) 擁有的字段總數(shù)
NR:目前 awk 所處理的是『第幾行』數(shù)據(jù)
FS:目前的分隔字符,預(yù)設(shè)是空格鍵
示例:將/etc/hosts中host和行號輸出
awk '{print "host:"$1 , "column:" NF}' /etc/hosts
awk計算統(tǒng)計
利用awk的BEGIN和END,BEGIN拷沸、END的示例如下:
awk 'BEGIN { statments } {commands} END {end commands}'
執(zhí)行BEGIN語句塊中的語句
從文件或者stdin中讀取一行色查,然后執(zhí)行statments,重復(fù)過程,直到文件全部被讀取完畢撞芍。
當(dāng)讀至輸入流末尾時秧了,執(zhí)行END{end commands}
statments中可以對變量初始化,commands中不同的command以分號分隔序无。
示例:統(tǒng)計日志中出現(xiàn)demo的次數(shù)
cat log.txt|grep demo|awk 'BEGIN{i=0}{i=i+1}END{print i}'
當(dāng)然根據(jù)變量的復(fù)制验毡,可以做其他更復(fù)雜的統(tǒng)計,例如求平均帝嗡,求和等等晶通。
實戰(zhàn):根據(jù)線上日志統(tǒng)計時間
統(tǒng)計ActivityConsumer時間:
cat app.log | grep "c.f.c.b.c.ActivityConsumer"|grep "Worker\[creditcloud\]"|\
awk 'BEGIN{begin=0;time=0;time10=0;time50=0;time100=0;time200=0;time500=0;timeM500=0;}\
{begin++;if($10<10){time10++} else if($10<50 && $10>=10){? time50++} \
else if($10 >=50 && $10 <100){time100++} else if($10 >=100 && $10 <200){time200++} \
else if($10 >=200 && $10 <500){ time500++}else{ timeM500++}; time+=$10}\
END{print "total:" begin " timetotal:"time;\
print " 10ms:" time10 " 50ms:" time50 " 100ms:" time100 "\
200ms:" time200 " 500ms:" time500 " more500ms:" timeM500;\
print " 10msP:" time10*100/time"%" " 50msP:" time50*100/begin "%"\
" 100msP:" time100*100/begin"%" " 200msP:" time200*100/begin"%"\
" 500msP:" time500*100/begin"%" " more500ms:" timeM500*100/begin"%" }'
結(jié)果:
total:49734 timetotal:4.23502e+06
10ms:10 50ms:22448 100ms:18872 200ms:6895 500ms:1314 more500ms:195
10msP:0.000236126% 50msP:45.1361% 100msP:37.9459% 200msP:13.8638% 500msP:2.64206% more500ms:0.392086%
sed
sed是常用的文本替換工具,它能完美的匹配正則表達式
先看sed命令的語法
sed [-nefr] [n1[,n2]]function
-n 安靜模式哟玷,經(jīng)過sed特殊處理的那一行會被輸出到屏幕上
-e 在指令列模式上進行sed的動作編輯
-f 將sed的動作寫在一個檔案內(nèi)狮辽,-f filename可以執(zhí)行filename內(nèi)的sed動作
-r sed的動作支持延伸型正規(guī)表示的語法。(默認是基礎(chǔ)的正規(guī)表示語法)
動作說明,n1,n2指需要操作的行數(shù)喉脖。
function的話主要由以下功能:
a :新增椰苟,a后面可以接字符串。而這些字符串會在新的一行出現(xiàn)动看。
c :取代尊剔,c后面可以接字符串,這些字符串可以取代n1,n2之間的行菱皆。
d:刪除
i:插入,i后面可以接字符串挨稿,這些字符串可以在新的一行出現(xiàn)仇轻。(目前行的上一行)
p:打印,亦即將某個選擇的數(shù)據(jù)打印出奶甘。通常p會與參數(shù)sed -n 一塊使用篷店。
s:取代,可以直接進行取代的工作臭家。通常這個s的動作可以搭配正規(guī)表示法疲陕。
示例:
寫了一個shell腳本,本來路徑用的直接路徑钉赁,因為非root用戶蹄殃,把腳本中直接路徑/home/user 改為~
本地文件執(zhí)行
sed? 's/\home\/admin/~/g' shell.sh
修改放入新的文件
sed? 's/\home\/admin/~/g' shell.sh > shell1.sh
刪除一個文件中幾行,這個比較簡單
可以看到輸出結(jié)果中你踩,2诅岩,3行被刪除
cat -n demo|sed '2,3d'
1? demo
4? test
?移除空白行
sed '/^$/d' shell.sh
添加一行
cat demo | sed '1a aaa'