日志常用统计技巧

最后更新: 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访问量统计。统计的命令与上面的类似。