shell入门学习笔记-15-命令详解: 三剑客之一awk-实例分析

版权声明:本文为博主hanchao5272原创文章,转载请注明来源,并留下原文链接地址,谢谢! https://blog.csdn.net/hanchao5272/article/details/89205963

系列目录与参考文献传送门: shell入门学习笔记-序章

awk 实例分析

1.分析日志

日志格式:

{data} {time} {log_level} {thread_id} {code_line_at_class} - http_{url}_request_请求耗时={use_time} {result}

others

统计各url的请求次数

[root@103-32-150-sh-100-M01 log]# awk '{a[$7]++}END{for(v in a) print v,a[v]}' info.log |grep  请求参数

筛选请求次数大于30次的url

awk '{a[$7]++}END{for(v in a) {if(a[v] >= 30) print v,a[v]}}' info.log |grep  请求参数

统计url请求次数,排序,取前3

awk '/请求参数/{a[$7]++}END{for(v in a) print v,a[v] |"sort -k2 -nr |head -3"}' info.log
  • sort -k2: 以第2列为基准进行排序
  • sort -n: 将排序列作为数值进行处理
  • sort -r: 倒序

限定在一段时间内,统计各url的请求次数

awk '$1" "$2 >= "2019-03-26 12:00:00,000" && $1" "$2 <= "2019-03-26 16:00:00,000" && $7~/请求参数/{a[$7]++}END{for(v in a) print v,a[v]}' info.log

2.文件比较

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
1
2
3
4
5
[worker@c2-a02-126-10-4 hanchao]$ cat b.txt
3
4
5
6
7

找出两个文件相同的记录:

[worker@c2-a02-126-10-4 hanchao]$ awk 'FILENAME=="a.txt"{print FILENAME,$0} FILENAME=="b.txt"{print FILENAME"="$0}' a.txt b.txt
a.txt 1
a.txt 2
a.txt 3
a.txt 4
a.txt 5
b.txt=3
b.txt=4
b.txt=5
b.txt=6
b.txt=7
[worker@c2-a02-126-10-4 hanchao]$ awk 'FILENAME=="a.txt"{arr[$0]} FILENAME=="b.txt"{if($0 in arr) print $0}' a.txt b.txt
3
4
5

找出存在于a.txt但是不存在于b.txt的记录

[worker@c2-a02-126-10-4 hanchao]$ awk 'FILENAME=="a.txt"{arr[$0]} FILENAME=="b.txt"{if($0 in arr){} else print $0}' a.txt b.txt
6
7

3.合并两个文件

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
zhangsan 20
lisi 23
wangwu 29
[worker@c2-a02-126-10-4 hanchao]$ cat b.txt
zhangsan man
lisi woman
wangwu man
[worker@c2-a02-126-10-4 hanchao]$ awk 'FILENAME=="a.txt"{arr[$1]=$0} FILENAME=="b.txt"{if($1 in arr) print arr[$1],$2}' a.txt b.txt

4.合并某一个特征的行

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
article/id_请求耗时=20ms
article/level_请求耗时=900ms
article/search_请求耗时=5ms
article/id_请求耗时=49ms
article/level_请求耗时=703ms
article/year_请求耗时=11ms
article/level_请求耗时=713ms
article/level_请求耗时=5ms
article/year_请求耗时=10ms
article/level_请求耗时=69ms
article/id_请求耗时=46ms
article/level_请求耗时=4ms
article/level_请求耗时=3ms
article/id_请求耗时=23ms
article/level_请求耗时=166ms
article/id_请求耗时=19ms
article/id_请求耗时=22ms
article/year_请求耗时=35ms
article/level_请求耗时=705ms
article/id_请求耗时=43ms
article/level_请求耗时=64ms
article/year_请求耗时=9ms
article/id_请求耗时=54ms
article/level_请求耗时=715ms

将每个URL的请求耗时 放在一行:

# 
[worker@c2-a02-126-10-4 hanchao]$ awk -vFS="=" -vOFS="=" '{a[$1]=a[$1]" "$2}END{for(v in a)print v,a[v]}' a.txt
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms 166ms 705ms 64ms 715ms
article/search_请求耗时= 5ms
article/id_请求耗时= 20ms 49ms 46ms 23ms 19ms 22ms 43ms 54ms
article/year_请求耗时= 11ms 10ms 35ms 9ms

# 执行过程
[worker@c2-a02-126-10-4 hanchao]$ awk -vFS="=" -vOFS="=" '{a[$1]=a[$1]" "$2;print $1,a[$1]}' a.txt | grep "article/level_"
article/level_请求耗时= 900ms
article/level_请求耗时= 900ms 703ms
article/level_请求耗时= 900ms 703ms 713ms
article/level_请求耗时= 900ms 703ms 713ms 5ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms 166ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms 166ms 705ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms 166ms 705ms 64ms
article/level_请求耗时= 900ms 703ms 713ms 5ms 69ms 4ms 3ms 166ms 705ms 64ms 715ms

5.行转列

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
1 2 3 4
5 6 7 8
9
# 对第一列的处理过程
[worker@c2-a02-126-10-4 hanchao]$ awk '{for(i=1;i<=NF;i++) {a[i]=a[i]$i" ";if(i==1)print a[i]}}' a.txt
1
1 5
1 5 9
# 全部处理
[worker@c2-a02-126-10-4 hanchao]$ awk '{for(i=1;i<=NF;i++) {a[i]=a[i]$i" ";}}END{for(v in a) print a[v]}' a.txt | sort -k1
1 5 9
2 6
3 7
4 8

6.字符串拆分

# 关键在于指定FS=''
[worker@c2-a02-126-10-4 hanchao]$ echo hello |awk -vFS='' '{for(i=1;i<=NF;i++) print $i}'
h
e
l
l
o
# split 乱序的
[worker@c2-a02-126-10-4 hanchao]$ echo hello |awk '{split($0,a,"''");for(v in a) print a[v]}'
l
o
h
e
l
# 通过length和substr实现
[worker@c2-a02-126-10-4 hanchao]$ echo hello |awk '{for(i=1;i<=length($0);i++)print substr($0,i,1)}'
h
e
l
l
o

7.行累加

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
zhangsan 2000
lisi 3000
zhangsan 1000
wangwu 1000
zhangsan 100
lisi 200
[worker@c2-a02-126-10-4 hanchao]$ awk '{name[$1];cost[$1]+=$2}END{for(v in name){print v,cost[v]}}' a.txt
zhangsan 3100
wangwu 1000
lisi 3200

8.获取某列最大值

[worker@c2-a02-126-10-4 hanchao]$ cat a.txt
article/id_请求耗时=20ms
article/level_请求耗时=900ms
article/search_请求耗时=5ms
article/id_请求耗时=49ms
article/level_请求耗时=703ms
article/year_请求耗时=11ms
article/level_请求耗时=713ms
article/level_请求耗时=5ms
article/year_请求耗时=10ms
article/level_请求耗时=69ms
article/id_请求耗时=46ms
article/level_请求耗时=4ms
article/level_请求耗时=3ms
article/id_请求耗时=23ms
article/level_请求耗时=166ms
article/id_请求耗时=19ms
article/id_请求耗时=22ms
article/year_请求耗时=35ms
article/level_请求耗时=705ms
article/id_请求耗时=43ms
article/level_请求耗时=64ms
article/year_请求耗时=9ms
article/id_请求耗时=54ms
article/level_请求耗时=715ms

# 查询每个请求的最大耗时
[worker@c2-a02-126-10-4 hanchao]$ cat a.txt |sed 's/ms//;' |awk -F '=' '{if($2>max[$1]) max[$1]=$2}END{for(v in max) print v,max[v]}'
article/level_请求耗时 900
article/search_请求耗时 5
article/id_请求耗时 54
article/year_请求耗时 35

9.去除首行和末行

[worker@c2-a02-126-10-4 hanchao]$ seq 5 |awk 'NR>2{print s}{s=$0}'
2
3
4

猜你喜欢

转载自blog.csdn.net/hanchao5272/article/details/89205963