sort
-u 清除重复的行 --unique
-r 降序 sort默认排序是升序
-n 按数值来排序
uniq
-c 在输出行前面加上每行在输入文件中出现的次数。
-d 仅显示重复行。
-u 仅显示不重复的行。
- n 前n个字段与每个字段前的空白一起被忽略。一个字段是一个非空格、非制表符的字符串,彼此由制表符和空格隔开(字段从0开始编号)。
+ n 前n个字符被忽略,之前的字符被跳过(字符从0开始编号)。
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 统计接口访问数量
awk '{print $7}' access.log.2015-08-22 | grep -e "\/v1\/" | sed 's/?.*$//g' |sort | uniq -c |sort -rn
例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"
cat access.log.2015-08-22 | grep -e "\/v1\/" | awk '{if($9~/200|30|404/)COUNT[$4]++}END{for( a in COUNT) print a,COUNT[a]}' | sort -k 2 -nr | head -n 3