日志結(jié)構(gòu)分析

分析日志狀態(tài)碼所在位置為第九個
遍歷取出第一行日志的每個字段
取出第一行日志
awk 'NR==1{for(i=1;i<=NF;i++)print i"= "$i}' Nginx.log

for循環(huán)取出每個字段
awk 'NR==1{for(i=1;i<=NF;i++)print i"= "$i}' nginx.log

練習1
找出所有404和500的錯誤日志,統(tǒng)計錯誤日志的行數(shù)
使用正則篩選出404 和500的類型的狀態(tài)碼,管道拼接統(tǒng)計總個數(shù)
完整命令 :cat nginx.log | awk '{print $9}' | grep -E '404|500'|wc -l
解法2:
使用awk 直接匹配第九個是400/500的狀態(tài)碼的值,awk 理論上可以替代grep awk 'pattern{action}'
awk 'BEGIN{} END{}’開始和結(jié)束
awk ' /Running/’正則匹配
awk ' / aa/ ,/bb/'區(qū)間選擇
用法 :cat nginx.log | awk '/ 404 | 500 /{print $9}' | wc -l
awk '$2~/xxx/'字段匹配
用法:awk '$9~/404|500/{print $9}' nginx.log | wc -l
awk 'NR==2'取第二行
awk 'NR>1’去掉第一行
使用t+1自增 計算統(tǒng)計: awk '$9~/404|500/{t+=1}END{print t}' nginx.log

練習2:
統(tǒng)計IP訪問量(獨立ip訪問數(shù)量)
# 打印所有ip, sort- u 去重排序,wc-l 統(tǒng)計總共數(shù)目
awk '{print $1}' nginx.log |sort -u |wc -l

練習3:
查看某一時間段的IP訪問量(1-2點)
查找出排序,unqi-c去重
grep "05/Dec/2018:0[1-2]" nginx.log|' | sort | uniq -c| sort -nr | wc -l
簡潔版:
grep "05/Dec/2018:0[1-2]" nginx.log | awk '{print $1}|sort -u |wc -l

練習4:
查看訪問最頻繁的前10個IP
查找ip 去重后,倒序排序,展示前10個
awk '{print $1}' nginx.log |sort -n |uniq -c|sort -rn| head -10

練習5
查看訪問100次以上的IP
#去重找到所有ipi地址,awk 判斷 將大于100的訪問次數(shù)打印后降序排序
awk '{print $1}' nginx.log |sort -n |uniq -c|awk '{if($1>100) print $0}'| sort -rn

練習6
找出名稱為 /topics 的平均響應(yīng)時間,響應(yīng)時間在倒數(shù)第二個字段

得知/topics 所在為第7個字段
#算出全部響應(yīng)時間 為倒數(shù)第二個字段: total和為{total+=$(NF-1) ,總次數(shù)為自增數(shù)據(jù)
less nginx.log | awk '$7=="/topics"{total+=$(NF-1);count+=1}END{print total/count}' nginx.log

響應(yīng)時間在倒數(shù)第二個字段
練習7
找出訪問量最高的頁面地址 借助于sed的統(tǒng)計分析
根據(jù)日志分析的頁面的地址,需要使用sed -E s (-e script 指定sed編輯命令 )替換
查找替換: s /REGEXP/REPLACEMENT /[FLAGS]
將第2替換為x:echo 1234 | sed 's#2#x#'
將第2和3替換為xecho 12433 | sed 's#[2-3]#x#g'
分組匹配與字段提取:sed 's#([0-9]*)l([a-z]*)#1 2#'
語法解析

未替換前語句
使用 sed -E 's#[0-9]{4,}'#_id_#' ' 將第四位的數(shù)字替換為_id_(注:s后的符號可以跟任意符號)

- /topics/16689/replies/124751/edit 把數(shù)字替換為 /topics/_id_/replies/_id_/edit
- /_img/uploads/photo/2018/c54755ee-6bfd-489a-8a39-81a1d7551cbd.png!large 變成 /_img/uploads/photo/2018/_id_.png!large
- /topics/9497 改成 /topics/_id_
- url中的query可以去掉
- 其他規(guī)則參考如上
awk '{print $7}' nginx.log |
sed -E
//替換字母數(shù)字編碼的圖片前綴為_id_
-e 's#/[0-9]*/[a-z0-9-]*.(png|gif|jpeg|jpg).*#/_id_/_id_.image#'
//替換問號和感嘆問為空
-e 's#[?!].*##'
-e 's#/(topics|replies|avatar)/[0-9]{1,}#/1/_id_#g'
// 替換topics|followers|following|favorites|replies|columns|reward|calendar|people 字段后的id
-e 's#/[^/]*/(topics|followers|following|favorites|replies|columns|reward|calendar|people)#/_uid_/1#'
-e 's#^/[^/]*$#/_top_#'
-e 's#/topics/node[0-9]*#/topics/node#' |
sort | uniq -c | sort -nr
}
練習7
性能統(tǒng)計腳本 perf_avg, 統(tǒng)計linux進程中 AliYunDun 進程的cpu與mem,持續(xù)統(tǒng)計20s,每秒輸出一下即時的cpu與mem的利用率,并在最后結(jié)束時候給出cpu與mem的平均值


//使用top -b 高亮展示當前進程,-d 1 每1s更新一次,-n 更新為3次
top -b -d 1 -n 3
// grep 實時取出數(shù)據(jù),
grep --line-buffered -i aliyundun$
//計算cpu與mem的利用率
cpu=$(NF-3);mem=$(NF-2);cpu_total+=cpu;mem_total+=mem;
//完整語句
top -b -d 1 -n 3 | grep --line-buffered -i aliyundun$ |
awk
//先打印抬頭
'BEGIN{OFS="t";print "CPUf", "MEM"}
{cpu=$(NF-3);mem=$(NF-2);print cpu,mem;cpu_total+=cpu;mem_total+=mem;
}
//最后打印數(shù)據(jù)
END{print "navg:" ;print cpu_total/NR, mem_total/NR}'
練習8:
網(wǎng)絡(luò)連接數(shù)統(tǒng)計 net_avg
// 查看網(wǎng)絡(luò)進程
netstat -tnp
//獲取 ip 和監(jiān)聽狀態(tài)
awk '{print $4,$6}'
//打印端口 號
awk -F : '{print $2}'
//完整命令
netstat -tnp |awk '{print $4,$6}'|awk -F : '{print $2}'|sort| uniq -c
優(yōu)化

去除上圖多余字段
//去除前兩行數(shù)據(jù)
sed 1,2d
//完整
netstat -tnp |sed 1,2d | awk '{print $4,$6}' | awk -F: '{print $2}' | sort | uniq -c | sort -nr