日志常用统计技巧
最后更新: 2013-01-08
常用命令
| 用途 | 常用命令 |
| 打包压缩 | gzip,tar |
| 内容输出 | tail,head,cat,zcat,more,less,管道,>,>> |
| 内容过滤 | grep,sed |
| 内容拆分 | awk,cut |
| 排序汇总 | sort,uniq,awk |
日志截取
按时间截取
# 截取指定时间段日志 sed -n '/^2012-12-26 14:30/,/^2012-12-26 14:32/p' server.log|more
按标识截取
截取特定标识日志的内容(仅特定标识日志行、或标识附近日志行)
# 过滤包含特定标识(忽略大小写)的日志、并显示前后10行 grep -i -A 10 -B 10 "error" server.log|more
按指定列截取
# 截取第7列为'/test'的行
cat server.log|awk 'if($7=="/test"{print $0}'|more
分页显示
使用more,less进行分页显示,more仅能简单地向后翻页,less可上下翻页、并可通过/word来查找包含word的行。
- 常用快键键
| 按键 | 功能 | 备注 |
| 空格 | 下一页 | |
| q | 退出 | |
| PgUp | 上一页 | less |
| PgDn | 下一页 | |
| /word | 查找word所在位置 | less |
| n | 查找下一个 | less |
| N | 查找下上个 | less |
使用管道、重定向
通过管道可将截取内容或统计结果直接存入文件中,其中>为覆盖原文件、>>为追加至文件。
grep -i -A 10 -B 10 "error" server.log > server_error.txt # > : 覆盖文件 # >> : 追加到文件末尾
日志统计
分时访问量统计
对日志中的时间列进行拆分,根据时间格式取YYYY-mm-DD HH:MM部分、进行排序、汇总,即可获得每分钟的访问量统计。
# 按分钟汇总统计访问量
cat server.log | grep "^2012-" | awk -F\: '{print $1" "$2":"$3}'|sort|uniq -c|more
# 按小时汇总统计访问量
cat server.log | grep "^2012-" | awk -F\: '{print $1" "$2"}'|sort|uniq -c|more
日志中的IP地址
WEB服务器日志(nginx,apache)中,通常第一列为客户端IP地址,取该段值进行排序、汇总,即可得到IP:访问次数的统计。
# 从日志中统计IP访问次数
cat server.log | awk '{print $1}'|sort|uniq -c|more
# 统计来访唯一IP数
cat server.log | awk '{print $1}'|sort|uniq|wc -l
网络连接状态
netstat命令可获取系统当前的侦听、连接状态,包括协议、源IP:端口、目标IP:端口、连接状态信息,取关注的列进行排序、汇总,即可获得连接数、状态等统计。
# TCP连接数
netstat -antp|grep ^tcp|awk '{print $5}'|awk -F\: '{print $1}'|sort|uniq -c|sort -nr
5 0.0.0.0
2 192.217.199.215
1 91.189.89.144
1 172.16.17.4
1 172.16.17.3
1 172.16.17.27
# TCP连接状态
netstat -antp|grep ^tcp|awk '{print $6}'|sort|uniq -c|sort -nr
17 ESTABLISHED
8 LISTEN
1 CLOSE_WAIT
# 根据Ficapy的反馈,使用awk的正则匹配进行过滤,减少前面的grep指令(谢谢Ficapy的提醒)
# 不过grep的过滤处理速度似乎比awk的正则匹配速度更快,因此对大日志分析时可能还是先用grep过滤效率更高
time cat netstat.txt |awk '/^tcp/ {print $6}'|sort|uniq -c|sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2
real 0m0.017s
user 0m0.014s
sys 0m0.002s
time cat netstat.txt |grep ^tcp|awk '{print $6}'|sort|uniq -c|sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2
real 0m0.008s
user 0m0.005s
sys 0m0.001s
# 其他awk匹配方式
cat netstat.txt |awk '{if($1=="tcp")print $6}'|sort|uniq -c|sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2
cat netstat.txt |awk '$1=="tcp" {print $6}'|sort|uniq -c|sort -nr
2713 TIME_WAIT
203 ESTABLISHED
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2
# 多条件匹配
cat netstat.txt |awk '/^tcp|^udp/ {print $1"-"$6}'|sort|uniq -c|sort -nr
2713 tcp-TIME_WAIT
203 tcp-ESTABLISHED
29 tcp-FIN_WAIT1
18 tcp-LISTEN
17 tcp-FIN_WAIT2
4 udp-32366/rpcbind
4 udp--
3 udp-32526/rpc.statd
2 udp-19339/rpc.mountd
1 udp-ESTABLISHED
1 udp-38143/gmond
1 udp-19335/rpc.rquotad
1 udp-1282/portreserve
cat netstat.txt |awk '{if($1~"^tcp" || $1~"^udp")print $1"-"$6}'|sort|uniq -c|sort -nr
2713 tcp-TIME_WAIT
203 tcp-ESTABLISHED
29 tcp-FIN_WAIT1
18 tcp-LISTEN
17 tcp-FIN_WAIT2
4 udp-32366/rpcbind
4 udp--
3 udp-32526/rpc.statd
2 udp-19339/rpc.mountd
1 udp-ESTABLISHED
1 udp-38143/gmond
1 udp-19335/rpc.rquotad
1 udp-1282/portreserve
cat netstat.txt |awk '{if($1=="tcp" && $6!~"ESTABLISHED")print $6}'|sort|uniq -c|sort -nr
2713 TIME_WAIT
29 FIN_WAIT1
18 LISTEN
17 FIN_WAIT2
URI、Agent统计
WEB服务器(apache,nginx,iis等)日志中,通常存有每个请求的URI、浏览器版本等信息,对其进行拆分、排序、汇总,即可获得各URI访问量统计。统计的命令与上面的类似。