通过日志分析的命令和脚本,筛选日志中有价值的内容,可以分析得出系统产生问题的原因。
一、日志分析常用命令
1、查看文件的内容
cat -n
2、分页显示文件
more
enter 显示文件下一行、空格键显示下一页、f键显示下一屏、b键显示上一屏
less 支持/查找
3、显示文件尾
tail -n -f
4、显示文件头
head -n
5、内容排序
sort -n数字排序 -r逆序 -t分隔符 -k 第几列
eg:
192.168.142.56 - - [09/Mar/2016:16:42:59 +0800] "POST /jdy-servlet/users HTTP/1.1" 200 11
按照响应时间排序: sort -n -t‘ ‘ -k10 fileName
6、字符统计
wc 可以统计指定文件中的字符数、字数、行数、并输出统计结果
7、查看重复出现的行
uniq
sort file | uniq -c 排序后去重
8、字符串查找
grep
grep -c qq file -c 显示查找到的行数
grep -c ‘G.*T‘ file 正则式
9、文件查找
find
find ./ -name ‘*.txt‘
find . -print 递归显示所有的文件
whereis startuo.sh 定位到文件系统中可执行文件的位置
10、表达式求值
expr
加减乘除 + - \* / %
字符串操作:
索引位置: expr index ‘www.baidu.com‘ com
字符串长度: expr length ‘www.baidu.com‘
11、归档文件
tar -c 生成新的包 -f 命名 -z 压缩 -x解压
-zcv -zxf
12、URL访问工具
curl
支持HTTP、HTTPS、FTP、FTPS、 Telnet等协议;
提交表单、传递cookie信息、构造refer等操作
实例:
1、查看请求访问量
192.168.143.39 - - [09/Mar/2016:08:20:54 +0800] "POST /jdy-servlet/users HTTP/1.1" 200 596
ip访问量前三: cat access_log.txt | cut -f1 -d‘ ‘ | sort -n | uniq -c | sort -r -n -k1 -t‘ ‘ | head -n3
页面访问量前三: cat access_log.txt | cut -d‘ ‘ -f7 | sort | uniq -c | sort -n -r -k1 -t‘ ‘ | head -n3
2、查看最耗时的页面
cat access_log.txt | sort -n -r -t‘ ‘ -k10 | head -n20
3、统计404请求占比
export total_line=`wc -l access_log.txt |cut -f 1 -d ‘ ‘` && export not_found_line=`awk ‘{if($9=="404")print $6}‘ access_log.txt|wc -l` && echo $not_found_line / $total_line
二、日志分析脚本
1、sed:
流编辑器是在编辑数据之前,预先指定数据的编辑规则,然后按照规则将数据输出到标准输出;
在流编辑器的搜欧规则与输入的行匹配完毕以后,编辑器读取下一行,重复之前的规则;
处理完搜所有的数据后,流编辑器停止;
sed是面向行的,并且sed不会修改文件本身;
s 文本替换
将日志中的jdy替换成google输出
sed ‘s/jdy/google/‘ access_log.txt | head -10
-n 输出指定的行
筛选文件中指定的行输出
sed -n ‘2,6p‘ access_log.txt
d 文本删除
根据正则表达式删除文件中指定的行
sed ‘/jdy/d‘ access_log.txt
= 显示文件行号
显示文件行号
sed ‘=‘ access_log.txt
i 行首插入内容
在行首插入文本 head
sed -e ‘i\head‘ access_log.txt | head -10
a 行末追加文本
在每一行的尾末追加ecd
sed -e ‘a\end‘ access_log.txt | head -10
c 将匹配到的行进行替换
sed -e ‘/jdy/c\hello‘ access_log.txt | head -10
将jdy替换为google,然后打印第一行到第七行,并且输出行号
sed -n ‘s/jdy/google/;1,7p;1,6=‘ access_log.txt
2、awk
awk提供了类似于编程的开放环境,能够自定义文本处理的规则
打印文件指定的列:
awk ‘{print $1}‘ access_log.txt | head -10
筛选指定的行,并打印其中的一部分列:
awk ‘/jdy/{print $5, $6}‘ access_log.txt | head -10
查找length大于40的行,并且打印改行的第三列:
awk ‘length($0)>40{print $3}‘ access_log.txt | head -10
输出第六行的请求方法和第十行的响应时间:
awk ‘{line = sprintf( "method:%s\", response:%s", $6, $10); print line}‘ access_log.txt |head -1
计算加总
$ cat count.txt | awk ‘{sum+=$1} END {print "Sum = ", sum}‘
Sum = 15.9
计算平均值
$ cat count.txt | awk ‘{sum+=$1} END {print "Average = ", sum/NR}‘
3、shell
(完善中…………)