awk 文本分析
舉個例子
- 按corpid統(tǒng)計訪問pv:
cat access.log | awk -F ',' '{a[$3]++}END{for(i in a){print i,a[i] | "sort -k 2 -rn"}}'
下面這種寫法是我后面回看的時候覺得應(yīng)該這么寫猖败,上面這種寫法看著不對熬荆,但是執(zhí)行結(jié)果一樣???♂????♂?
cat access.log | awk -F ',' '{a[$3]++}END{for(i in a){print i,a[i] }}' | sort -k 2 -rn
cat access.log | awk -F ',' '{a[$3]=a[$3]+1}END{for(i in a){print i,a[i] }}' | sort -k 2 -rn
- 按url統(tǒng)計訪問pv:
cat access.log | awk -F ',' '{a[$4]++}END{for(i in a){print i,a[i] }}' | sort -k 2 -rn
熟悉日志格式
[2018-10-23 09:59:10] [traceid=232a43a484844e2b9561df41919c0fed,uid=042227242237740794,corpId=xxx,uri=/rest/api/v1/xxx/xxx,host=127.0.0.1,ref=,ua=Mozilla/5.0 (Macintosh; Intel Mac OS X 10_13_6) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/69.0.3497.100 Safari/537.36] INFO ACCESS_LOGGER - request:/rest/api/v1/xxx/xxx
awk命令拆分
awk -F ',' '{a[$3]++}END{for(i in a){print i,a[i]}}' access.log | sort -k 2 -rn
cat access.log | awk -F ',' '{print $3}'
cat access.log | awk -F ',' '{a[$3]++}END{for(i in a){print i,a[i]}}'
cat access.log | awk -F ',' '{a[$3]++}END{for(i in a){print i,a[i]}}' | sort -k 2 -rn
| 管道符左邊命令的輸出就會作為管道符右邊命令的輸入
' ' 引用代碼塊
{} 命令代碼塊诞外,包含一條或多條命令
执隧; 多條命令使用分號分隔
END 結(jié)尾代碼塊设易,在對每一行進行處理之后再執(zhí)行的代碼塊巢墅,主要是進行最終計算或輸出結(jié)尾摘要信息
|| | 或
進階
- 按照corpid+userid統(tǒng)計
cat access.log | awk -F ',' '{a[$3$2]++}END{for(i in a){print $3,$2,a[i] | "sort -k 3 -rn"}}'
- 按照corpid+userid+uri統(tǒng)計
應(yīng)用場景--統(tǒng)計出錯的企業(yè)等
- 請求的部門id不在授權(quán)范圍內(nèi)
cat logs/xxx.log | grep "end to get hrm, fail" | awk -F ' - ' '{print $2}' | awk -F ',' '{print $1}'
- 不合法的access_token
cat logs/xxx.log | grep "errorMsg = 不合法的access_token" | awk -F 'corpId = ' '{print $2}' | awk -F ',' '{print $1}' | uniq
- 請求總次數(shù)超過了 1000 次
cat logs/xxx.log | grep "請求總次數(shù)超過了 1000 次" | grep "corpId(" | awk -F 'corpId' '{print$2}' | awk -F 'uri' '{print substr($1,2,length($1)-4)}' | uniq
- 請求總次數(shù)超過了 300 次
cat logs/xxx.log | grep "請求總次數(shù)超過了 300 次" | grep "corpId =" | awk -F 'corpId = | deptId = ' '{print $2}' | uniq
- 進階:請求總次數(shù)超過了 300 次迁酸,發(fā)生的時間和企業(yè)讲冠,時間按企業(yè)統(tǒng)計
[2018-10-24 10:02:13] [traceid=,uid=,corpid=,uri=] WARN c.d.xxx.xxx.xxx.xxx - xxx. errorCode = 90002, errorMsg = 您的服務(wù)器調(diào)用釘釘開放平臺當(dāng)前接口的所有請求都被暫時禁用了, apiPath(/user/list), 從 2018-10-24 10:02:13 到 2018-10-24 10:02:13 請求總次數(shù)超過了 300 次, 處罰將在 2018-10-24 10:02:14 結(jié)束., corpId = xxx, deptId = 63590251.
man
cd ls df du
查看目錄
cd
ls -lh
查看目錄掛載點
df -lh
df -lh /home/admin/xxx/logs
查看文件夾大小
du -sh
du -sh /home/admin/xxx/logs
du -sh *
sort
排序
du -s * | sort -rn
du -sh * | sort -rn
uniq
去重
cat access.log | awk -F ',' '{print $3}' | awk -F '=' '{print $2}' | sort | uniq
進階
排序去重統(tǒng)計
cat access.log | awk -F ',' '{print $3}' | awk -F '=' '{print $2}' |sort | uniq -c | sort -rnk 1
tailf tee
tailf xxx.log | tee 111.log
grep
過濾
根據(jù)日志級別,企業(yè)id等條件過濾
tailf xxx.log | grep INFO
cat xxx.log | grep INFO
grep --color=auto
grep "INFO" error*
grep -v
grep -ri
grep -E 'k1|k2'
egrep 'k1|k2'
grep -B 5 "ERROR"
grep -A 5 "ERROR"
grep -5 "ERROR"
grep -5 "ERROR" -n 顯示行號
vi :行號跳轉(zhuǎn)
sed
echo "aaa=111" > aaa.log
echo "bbb=222" >> aaa.log
sed -n '/aaa=/p' aaa.log
sed -n "/aaa/ s/111/112/p" aaa.log
sed -i "/aaa/ s/111/112/g" aaa.log
n命令-->匹配行的下一行
sed -i "/aaa/ {n;s/bbb/ccc/g;}" aaa.log
tr
echo -e "dingxxx,\ndingxxx,\ndingxxx," > corp.log
cat corp.log | tr -s ',\n' ","
cat corp.log | tr -d '\n' | awk '{print substr($0,1,length($0)-1)}' | pbcopy
dos2unix
dos2unix filename
xargs
tailf xxx.log > sq.log &
ps -ef | grep "tailf xxx.log" | grep -v "grep" | awk -F" " '{print $2}' | xargs kill -9
ls ./ | grep xxx | xargs grep "ERROR"
效果等同于 grep "ERROR" ./xxx*
vi使用技巧
vi ./
set hls
set nu / set nonu
shift g / gg
n / shift n
ctrl f / ctrl b
echo " <logger name="METHOD_LOGGER">
<level value="warn"/>
<appender-ref ref="CONSOLE"/>
<appender-ref ref="FILE"/>
</logger>" > logback
s/warn/debug/g
1,$s/warn/debug/g
命令行快捷鍵
Ctrl + a beginning-of-line
Ctrl + e end-of-line