概念说明
- 擅长对列进行操作处理
- 擅长对文件数据进行分析统计
awk命令操作处理文件内容的方法
1.查询操作
2.排除
3.替换
4.统计
命令格式
awk [选项] '模式{动作}' [文件信息]
awk
参数 | 解释说明 |
---|---|
-F | 指定字段分隔符 |
-v | 定义或修改一个awk内部的变量 |
模拟测试环境
[root@libielang ~]# cat reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
Xiaoyu Liu 195753468 :195:111:178
注意区分大小写,
过滤第二行信息
[root@libielang ~]# awk 'NR==2' reg.txt
Meng Feixue 80042789 :250:60:50
查询第一列信息
[root@libielang ~]# awk '{print $1}' reg.txt
Zhang
Zhang
Meng
Wu
Liu
Wang
Zi
Li
Lao
Xiaoyu
过滤最后一列信息
[root@libielang ~]# awk '{print $(NF-0)}' reg.txt
:155:90:201
:250:60:50
:250:80:75
:250:100:175
:50:95:135
:250:168:200
:175:75:300
:250:100:175
:195:111:178
$(NF-0)===$NF
过滤第一列和倒数第二列信息
[root@libielang ~]# awk '{print $1,$(NF-1)}' reg.txt
Zhang 390320151
Meng 80042789
Wu 70271111
Liu 41117483
Wang 3515064655
Zi 1986787350
Li 918391635
Lao 918391635
Xiaoyu 195753468
过滤包含Xiaoyu的行
[root@libielang ~]# awk '/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
Xiaoyu Liu 195753468 :195:111:178
过滤第二列里 包含Xiaoyu行
[root@libielang ~]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
$2~
只过滤第2列里包含Xiaoyu的,其他列包含的不过滤
过滤包含Xiaoyu行的第三列的信息
[root@libielang ~]# awk '/Xiaoyu/{print$3}' reg.txt
390320151
195753468
过滤第二列包含Xiaoyu行的第三列的信息
[root@libielang ~]# awk '$2~/Xiaoyu/{print $3}' reg.txt
390320151
以:为分隔符显示第一列的内容
[root@libielang ~]# awk '{print$1}' reg.txt #以空格为分隔符的第一列
Zhang
Meng
Wu
Liu
Wang
Zi
Li
Lao
Xiaoyu
[root@libielang ~]# awk -F':' '{print $1}' reg.txt #以冒号为分隔符的第一列
Zhang Xiaoyu 390320151
Meng Feixue 80042789
Wu Waiwai 70271111
Liu Bingbing 41117483
Wang Xiaoai 3515064655
Zi Gege 1986787350
Li Youjiu 918391635
Lao Nanhai 918391635
Xiaoyu Liu 195753468
awk默认会以[空格]为分隔符
awk按大小查找
符号
\> 大于
\< 小于
\>= 大于等于
\<= 小于等于
\== 等于
\!= 不等于
查找第三行大于900的行
[root@libielang ~]# awk -F: '$3>900' /etc/passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
oldboy:x:1000:1000::/home/oldboy:/bin/bash
/etc/password文件是以:分隔,所以需要指定下分隔符
查找第三行大于900,小于1000的行
[root@libielang ~]# awk -F: '$3>900&&$3<1000' /etc/passwd
polkitd:x:999:998:User for polkitd:/:/sbin/nologin
chrony:x:998:996::/var/lib/chrony:/sbin/nologin
awk按范围查找
查找10:10到10:11的内容
[root@libielang ~]# awk '/10:10/,/10:11/' access.log
查找第一行到第五行的内容
[root@libielang ~]# awk 'NR==1,NR==5' reg.txt
Zhang Dandan 41117397 :250:100:175
Zhang Xiaoyu 390320151 :155:90:201
Meng Feixue 80042789 :250:60:50
Wu Waiwai 70271111 :250:80:75
Liu Bingbing 41117483 :250:100:175
查找第一行和第五行的内容
[root@libielang ~]# awk 'NR==1;NR==5' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
查找第四列为10:10到10:11的内容
[root@libielang ~]# awk '$4~/10:10/,$4~/10:11/' access.log
特殊
BEGIN{}
现在多用于测试
BEGIN{}里面的内容会在awk读取文件之前运行
运算3的三次方
[root@libielang ~]# awk 'BEGIN{print 3^3}'
27
END{}
显示计算结果,END{}里面的内容会awk读取文件之后运行
可以统计空行
[root@libielang ~]# cat -n file.txt
1 dasdafa
2 abc
3 123
4 qwe
5
6
7 rtyu
8 dgfgfdh
9
10 4615198561
11
12 abcd123abcd
[root@libielang ~]# awk '/^$/{i=i+1}END{print i}' file.txt
4
计算
i=i+1 i++
计算1.txt 数字的总和
[root@libielang ~]# cat 1.txt
1
2
3
4
5
6
7
8
9
10
[root@libielang ~]# awk '{i=i+$1;print i}' 1.txt
1
3
6
10
15
21
28
36
45
55
[root@libielang ~]# awk '{i=i+$1}END{print i}' 1.txt
55