1、测试数据
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
2、awk命令显示特定列
[root@PC3 test]# awk '{print $1}' a.txt ## 显示第一列
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk '{print $1,$3}' a.txt ## 显示第一列和第三列
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{print $0}' a.txt ## 显示所有列
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
2、awk命令删除列
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{$2="";print $0}' a.txt ## 删除第二列
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt ## 删除第一列和第三列
78
345
668
23
35
35
45
2334
098
awk删除列不能够删除空格!将多个空格或者制表符转换为一个空格的方法:
[root@PC3 test]# awk '{$2="";print $0}' a.txt
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{$2="";print $0}' a.txt | sed 's/[\t ]\+/ /' ## 将多个空格或者制表符转换为一个空格
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt
78
345
668
23
35
35
45
2334
098
[root@PC3 test]# awk '{$1="";$2="";print $0}' a.txt | sed 's/^[\t ]*//g' ## 删除行首空格
78
345
668
23
35
35
45
2334
098
3、awk命令指定读取分割符
[root@PC3 test]# cat a.txt
34_rtd_78
98_fgg_345
23_fgg_668
45_dfs_23
10_fsd_35
77_jla_35
87_saf_45
53_sfg_2334
46_wrt_098
[root@PC3 test]# awk '{print $1}' a.txt ## awk的复制分割符为空格或者制表符,因此输出了所有的内容
34_rtd_78
98_fgg_345
23_fgg_668
45_dfs_23
10_fsd_35
77_jla_35
87_saf_45
53_sfg_2334
46_wrt_098
[root@PC3 test]# awk -F "_" '{print $1}' a.txt ## 指定输入分割符为_.
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk -F "_" '{print $1,$2}' a.txt
34 rtd
98 fgg
23 fgg
45 dfs
10 fsd
77 jla
87 saf
53 sfg
46 wrt
[root@PC3 test]# awk 'BEGIN{FS="_"}{print $1}' a.txt ## 利用FS指定分割符
34
98
23
45
10
77
87
53
46
[root@PC3 test]# awk 'BEGIN{FS="_"}{print $1,$2}' a.txt
34 rtd
98 fgg
23 fgg
45 dfs
10 fsd
77 jla
87 saf
53 sfg
46 wrt
4、awk指定输出分割符
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{print $1,$3}' a.txt
34 78
98 345
23 668
45 23
10 35
77 35
87 45
53 2334
46 098
[root@PC3 test]# awk '{OFS="!"}{print $1,$3}' a.txt ## 指定输出分隔符为!
34!78
98!345
23!668
45!23
10!35
77!35
87!45
53!2334
46!098
同时指定多个分隔符:
[root@PC3 test]# cat b.txt ## 测试数据
3_d_5_k
a 2 8 f
4:8:2:d
[root@PC3 test]# awk '{print $1,$3}' b.txt ## awk的默认读取分隔符为空格或者制表符
3_d_5_k
a 8
4:8:2:d
[root@PC3 test]# awk -F "[_ ]" '{print $1,$3}' b.txt ## 指定分隔符为_或者空格
3 5
a 8
4:8:2:d
[root@PC3 test]# awk -F "[_ :]" '{print $1,$3}' b.txt ## 指定分割符为_或者空格或者:.
3 5
a 8
4 2
5、awk命令打印行数
[root@PC3 test]# awk '{print NR,$0}' a.txt
1 34 rtd 78
2 98 fgg 345
3 23 fgg 668
4 45 dfs 23
5 10 fsd 35
6 77 jla 35
7 87 saf 45
8 53 sfg 2334
9 46 wrt 098
6、awk打印列数
[root@PC3 test]# awk '{print NF}' a.txt
3
3
3
3
3
3
3
3
3
7、awk打印匹配行
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 ~ /45/{print $0}' a.txt ## 打印第一列匹配45的行
45 dfs 23
[root@PC3 test]# awk '$2 ~ /fgg/{print $0}' a.txt ## 打印第二列匹配fgg的行
98 fgg 345
23 fgg 668
[root@PC3 test]# awk '$2 ~ /fgg/ && $3 ~ /345/{print $0}' a.txt ## 打印第二列匹配fgg,同时第三列匹配345的行
98 fgg 345
8、awk依据数值大小过滤行
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 > 50 {print $0}' a.txt ## 过滤第一列大于50的行
98 fgg 345
77 jla 35
87 saf 45
53 sfg 2334
[root@PC3 test]# awk '$1 > 50 && $2 ~ /fgg/ {print $0}' a.txt ## 同时满足两个条件
98 fgg 345
而且与或者
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 >= 30 && $1 <= 80 {print $0}' a.txt ## 大于30而且小于80
34 rtd 78
45 dfs 23
77 jla 35
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '$1 <= 30 || $1 >= 80 {print $0}' a.txt ## 小于30 或者 大于80
98 fgg 345
23 fgg 668
10 fsd 35
87 saf 45
9、awk if条件分支
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 20){print $0}}' a.txt ## 根据第一列进行判断
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 20){print $0} else {print $1}}' a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{if($1 > 80){print $0} else if($1 > 50) {print $1,$2} else {print $1}}' a.txt
34
98 fgg 345
23
45
10
77 jla
87 saf 45
53 sfg
46
10、awk输出奇数行、偶数行和整倍数行
[root@PC3 test]# cat a.txt
1 34 rtd 78
2 98 fgg 345
3 23 fgg 668
4 45 dfs 23
5 10 fsd 35
6 77 jla 35
7 87 saf 45
8 53 sfg 2334
9 46 wrt 098
[root@PC3 test]# awk '{if(NR%2 == 0){print $0}}' a.txt ## 取偶数行
2 98 fgg 345
4 45 dfs 23
6 77 jla 35
8 53 sfg 2334
[root@PC3 test]# awk '{if(NR%2 != 0){print $0}}' a.txt ## 取奇数行
1 34 rtd 78
3 23 fgg 668
5 10 fsd 35
7 87 saf 45
9 46 wrt 098
[root@PC3 test]# awk '{if(NR%3 == 0){print $0}}' a.txt ## 取3倍整数行
3 23 fgg 668
6 77 jla 35
9 46 wrt 098
11、awk 列之间的四则运算
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{print $1 + $3}' a.txt ## 求和
112
443
691
68
45
112
132
2387
144
[root@PC3 test]# awk '{print $1 - $3}' a.txt ## 差
-44
-247
-645
22
-25
42
42
-2281
-52
[root@PC3 test]# awk '{print $1 * $3}' a.txt ## 积
2652
33810
15364
1035
350
2695
3915
123702
4508
[root@PC3 test]# awk '{print $1 / $3}' a.txt ## 商
0.435897
0.284058
0.0344311
1.95652
0.285714
2.2
1.93333
0.0227078
0.469388
[root@PC3 test]# awk '{print $1 % $3}' a.txt ##余数
34
98
23
22
10
7
42
53
46
12、awk求列的和以及平均数
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk '{sum += $1}END{print sum}' a.txt ## 求第一列的和
473
[root@PC3 test]# awk '{sum += $1}END{print sum/NR}' a.txt ## 求第一列的平均数
52.5556
13、awk 引入变量值
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# a=2
[root@PC3 test]# awk -v b=$a '{print $b}' a.txt
rtd
fgg
fgg
dfs
fsd
jla
saf
sfg
wrt
14、awk 统计特定字符在一行中出现的次数
[root@PC3 test]# cat a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
[root@PC3 test]# awk -F "3" '{print NF-1}' a.txt ## 统计3在每一行中出现的次数
1
1
1
1
1
1
0
3
0
15、awk命令删除空行
[root@PC3 test]# cat -A a.txt
34 rtd 78$
98 fgg 345$
23 fgg 668$
$
45 dfs 23$
10 fsd 35$
77 jla 35$
87 saf 45$
53 sfg 2334$
46 wrt 098$
[root@PC3 test]# awk NF a.txt
34 rtd 78
98 fgg 345
23 fgg 668
45 dfs 23
10 fsd 35
77 jla 35
87 saf 45
53 sfg 2334
46 wrt 098
16 、awk命令忽略大小写
[root@PC3 test]# cat a.txt
3 a d
9 k a
2 h A
c 3 k
1 z c
3 A 5
[root@PC3 test]# awk '/a/' a.txt
3 a d
9 k a
[root@PC3 test]# awk '/A/' a.txt
2 h A
3 A 5
[root@PC3 test]# awk 'BEGIN{IGNORECASE=1} /a/' a.txt
3 a d
9 k a
2 h A
3 A 5
17、awk 命令大小写转换
[root@PC3 test]# cat a.txt
3 a d
9 k a
2 h A
c 3 k
1 z c
3 A 5
[root@PC3 test]# awk '{print toupper($0)}' a.txt
3 A D
9 K A
2 H A
C 3 K
1 Z C
3 A 5
[root@PC3 test]# awk '{print tolower($0)}' a.txt
3 a d
9 k a
2 h a
c 3 k
1 z c
3 a 5
[root@PC3 test]# awk '{print toupper($2)}' a.txt
A
K
H
3
Z
A
18、awk命令计算某一类文件总的大小
[root@PC3 sheep]# ls
a.ped result.map result.ped tr.map
[root@PC3 sheep]# ls -lh
total 1.1G
-rw-r--r--. 1 root root 204M Jan 30 11:33 a.ped
-rw-r--r--. 1 root root 20M Jan 14 11:33 result.map
-rw-r--r--. 1 root root 829M Jan 14 11:33 result.ped
-rw-r--r--. 1 root root 7.4M Jan 30 11:33 tr.map
[root@PC3 sheep]# ls -l *.map | awk '{sum +=$5}END{print sum/(1024*1024),"Mb"}'
26.9319 Mb
19、awk命令依据行的长度进行筛选
[root@PC3 test]# cat a.txt
3
9k
2hA
cfsd
1zc3d
3A5sdf
asfdfds
safssdff
sfafsfsfa
asfdfdfsee
[root@PC3 test]# awk 'length == 3' a.txt
2hA
[root@PC3 test]# awk 'length == 6' a.txt
3A5sdf
[root@PC3 test]# awk 'length > 6' a.txt
asfdfds
safssdff
sfafsfsfa
asfdfdfsee
[root@PC3 test]# awk 'length < 4' a.txt
3
9k
2hA
[root@PC3 test]# awk 'length > 2 && length < 6' a.txt
2hA
cfsd
1zc3d