读书笔记-在线日志分析的常用命令
摘自《大型分布式网站架构设计与实践》 4.1在线日志分析
1.基础命令
操作 | 命令 | 说明 |
查看文件的内容 | cat -n access.log | -n显示行号 |
分页显示文件 | more access.log | Enter下一行,空格下一页,F下一屏,B上一屏 |
分页显示文件 | less access.log | 输入 /字符串 可查找并高亮 |
显示文件尾 | tail -n2 -f access.log | -n2显示最后2行,-f继续监听不退出 |
内容排序 | sort -k 2 -t ' ' -n access.log | -k指定排序列,-t指定列分隔符,-n按数字顺序 |
字符统计 | wc -l access.log | -l统计行数,-c字符数,-L最长行长度,-w单词数 |
查看重复出现的行 | sort testfile | uniq -c -d | uniq去重,-c统计重复次数,-d只显示重复的 |
字符串查找 | grep 'G.*T' access.log | 查找G开头T结尾的字符串 |
文件查找 | find /home/java -name access.log | 递归/home/java的子目录找名为access.log |
表达式求值 | expr 10 \* 3 | 计算10*3,其中\*表示转义*不解读为通配符 |
表达式求值 | expr length "this is a test" | 计算长度 |
归档文件 | tar -cf aaa.tar f1 f2 | -c创建,-f指定包名 |
归档文件 | tar -xf aaa.tar | -x解压 |
URL访问 | curl www.google.com | 不带参返回响应体,-i返回带响应头,-I仅返回响应头 |
查看CPU的load | uptime | |
查看CPU使用率 | top | grep Cpu | 按1查看每个核,按shift+H按线程查看 |
查看CPU使用率 | top -p 2864 | 查看指定进程 |
磁盘剩余空间 | df -h | |
磁盘剩余空间 | du -d 1 -h /home/java | 分析目录的磁盘使用。-d设置递归深度 |
网络traffic | sar -n DEV 1 1 | DEV查看各个网卡,1秒抽样,1总共取一次 |
磁盘I/O | iostat -d -k | |
内存使用 | free -m | 通常是看“-/+ buffers/cache”对应的used和free |
内存使用 | vmstat | 查看swap I/O |
2.sed编辑器
操作 | 命令 | 说明 |
文本替换 | sed 's/xxx/yahoo/' access.log | head -10 | 不会修改原文件 |
输出指定的行 | sed -n '2,6p' access.log | 输出2-6行 |
删除行 | sed '/qq/d' access.log | /d排除含关键字qq的行 |
整行替换 | sed -e '/google/c\hello' access.log | head -10 | /c替换的是整个匹配的行 |
多个命令合并 | sed -n '1,5p;1,5=' access.log | 边打印行边打印行号 |
3.awk程序
操作 | 命令 |
筛选行,打印指定列 | awk '/google/{print $0,$6}' access.log | head -10 |
按条件打印 | awk 'length($0)>40{print $3}' access.log | head -10 |
格式化输出 | awk '{line= sprintf("method:%s,response:%s", $3, $7); print line}' access.log | head -10 |
4.实用例子
操作 | 命令 | 说明 |
查看请求访问量 | ||
访问量前10的IP | cat access.log | cut -f1 -d " " | sort | uniq -c |sort -k 1 -n -r | head -10 | cut部分表示取第1列即IP列,取第4列则为URL的访问量 |
查看最耗时的页面 | cat access.log | sort -k 2 -n -r | head -10 | 按第2列响应时间逆序排序 |
统计404请求的占比 | ||
总请求数 | export total_line= `wc -l access.log | cut -f1 -d " "` | |
404请求数 | export not_found_line= `awk '$6=='404'{print $6}' access.log | wc -l` | |
占比 | expr $not_found_line \* 100 / $total_line | &&或;可合并为一行。 |