sort http://blog.chinaunix.net/uid-10540984-id-313479.html sort命令的k选项大讨论
-u 清除重复的行 --unique -c 检查文件是否已经按照顺序排序
-r 降序 sort默认排序是升序 -o 输出文件 sort -r num.txt -o num.txt 把结果写入原文件
-b 忽略每行前面开始的空格字符 -u 删除重复行
-t '' 指定排序时分隔字符 sort -n -t ':' -k 2 以冒号分隔 并以第二列数字排序
-k 选择以哪个区间进行排序 -f 会将小写字母都转换为大写字母来进行比较,即忽略大小写
uniq http://blog.chinaunix.net/uid-26495963-id-3282526.html
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+ n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
去双引号 sed 's/"//g' 或 sed '/"/s/"//g'
分隔符
sort -t ':' -k 2 以冒号分隔 并以第二列排序
cut -d ':' -f 2 以冒号分隔 显示第二列 delimiter 分隔符 fields 域
awk -F ':' '{print $2}' 以冒号分隔 显示第二列
awk
awk '$1>60 && $1<90 {print $2}' log 显示大于60并小于90的
a 统计访问不重复的IP数量
cat access.log | awk '{print $1}' | sort -u | wc -l
cat access.log | awk '{print $1}' | sort | uniq -c | wc -l
b 查看访问量最高的前10个IP
awk '{print $1}' access.log | sort |uniq -c | sort -n -k1 -r | head -n 10
c owl nginx日志分析
统计接口访问数量
awk '{print $7}' access.log | grep -e "\/v1\/" | sed 's/?.*$//g' |sort | uniq -c |sort -rn
取接口与响应时间, 并以响应时间排序 引号中有空格
sed -e 's/"//g' -e 's/?.*$//g' log | awk '{print $7,$NF}'| grep "^/v2/"|grep -v "http" | grep -v " /v2/" | sort -n -k2
响应时间大于500ms接口访问排序
sed -e 's/"//g' -e 's/?.*$//g' access.log | awk '$NF>0.5{print $7}' | grep '^/v2/' | sort | uniq -c | sort -rn
日志中出现的所有接口
sed -e 's/"//g' -e 's/?.*$//g' access.log |awk '{print $7}'| grep "^/v2/" | grep -v http | sort -u
单个接口访问时间求和
grep -w /v2/rest/app/sys/init 1 | awk '{sum+=$2} END {print sum}'
例1
字符串(url):http://abc13.EFG.com:4160/graph?node=26125 &offset=0&nbins=1&irversion=601&format=xml
要求: 从以上字符串中抽取:26125
实现:echo $url | sed 's/^.*node= //g' | sed 's/&.*$ //g'
例2
字符串 13:48:52.042 [http-nio-80-exec-32] INFO web.Filter - ip=112.97.50.129,uri=/v1/rest/app/live/Subscribe,param=token[f3d32dec-4e26-41ad-be9f-08ae9a43f949]
要求 过滤出token,去掉重复
实现 grep -o ........-....-....-....-............ catalina.out | sort | uniq -c | awk '{print $2}'
1) ^ : 代表当前行首:^.*node= 表示行首到node=以及他们二者之间包括的所有字符
2) $ : 代表当前行尾 : &.*$ 表示&到末尾,以及它们之间的所有字符
3) & : 代表其前 pattern 字串
例3
sed -e 's/test/& my car/' 替换后变为:test my car
4) /t.*t/d :"." 表示任意字符; "*" 表示当前字符可重任意次 , 它们结合 ".*" 表示两 "t" 字母间的任意
d 把问号后的字符替换为空
sed 's/?.*$//g' a
e 查看http请求数及其连接状态
netstat -an | awk '/^tcp/{ A[$NF]++} END{ for (a in A) print a, A[a]}'
netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
解析:
CLOSED //无连接是活动的或正在进行
LISTEN //服务器在等待进入呼叫
SYN_RECV //一个连接请求已经到达,等待确认
SYN_SENT //应用已经开始,打开一个连接
ESTABLISHED //正常数据传输状态/当前并发连接数
FIN_WAIT1 //应用说它已经完成
FIN_WAIT2 //另一边已同意释放
ITMED_WAIT //等待所有分组死掉
CLOSING //两边同时尝试关闭
TIME_WAIT //另一边已初始化一个释放
LAST_ACK //等待所有分组死掉
f 统计状态码
日志格式 "GET /test HTTP/1.1" 200 41581
grep -oP 'HTTP/1.1" \d+ ' access_log | cut -d' ' -f2 | sort | uniq -c
如上命令首先提取状态码,为了避免日志中存在的其它数字对统计的影响,先提取HTTP/1.1" 数字的字符串,然后利用cut命令取得状态码,然后再去统计。
g 统计每秒接口访问次数
$4 $5 $6 $7 $8 $9
119.39.188.158 - - [22/Aug/2015:22:40:02 +0800] "POST /v1/rest/app/live/home/two HTTP/1.1" 200 11336 "-" "-" - "127.0.0.1:8080" "200" "0.078" "0.078"
grep "/v2/" access.log | awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' | sort -k 2 -nr | head -n 3