[root@localhost ~]# cat file
otherxxxx
name: 123
book: abc
book: efg
tel:123456
other: xxxx
name: 456
book: zzz
tel: 123456
tel: 898989
otherxxx
[root@localhost ~]# cat file |awk ‘/^book/‘
book: abc
book: efg
book: zzz
[root@localhost ~]# awk 过滤以book开头的行
awk ‘/^book/’ 输出以book 开头的行,其实是省略了 {print $0}, 完整的语句是
awk ‘/^book/ {print $0}’这样。
[root@localhost ~]# cat file
otherxxxx
name: 123
book: abc
book: efg
tel:123456
other: xxxx
name: 456
book: zzz
tel: 123456
tel: 898989
otherxxx
[root@localhost ~]#
[root@localhost ~]# awk ‘/^book/‘ file
book: abc
book: efg
book: zzz
[root@localhost ~]# awk ‘/^book/{print $0}‘ file
book: abc
book: efg
book: zzz
[root@localhost ~]# awk -F ‘:‘ ‘/^book/{print $1}‘ file
book
book
book
[root@localhost ~]# awk -F ‘:‘ ‘/^book/{print $2}‘ file
abc
efg
zzz
[root@localhost ~]#
$NF : 表示列字段的数量
NR : 表示当前的行号
[root@localhost ~]# cat -n file
1 otherxxxx
2 name: 123
3 book: abc
4 book: efg
5 tel:123456
6 other: xxxx
7 name: 456
8 book: zzz
9 tel: 123456
10 tel: 898989
11 otherxxx
[root@localhost ~]# awk -F ‘:‘ ‘/^book/{print NR $2}‘ file
3 abc
4 efg
8 zzz
[root@localhost ~]#
[root@localhost ~]# awk -F ‘:‘ ‘/^book/{print NR $2"我是你爹"}‘ file
3 abc我是你爹
4 efg我是你爹
8 zzz我是你爹
[root@localhost ~]#
awk $0就表示一个记录
printf 默认不换行
print $0 就是打印整行内容
[root@localhost ~]# cat file |awk -F ‘:‘ ‘/^book/{printf $0}‘
book: abcbook: efgbook: zzz[root@localhost ~]#
[root@localhost ~]#
可以END 输入一个变量xxxoo,因为xxxoo 为空,所以会换行
[root@localhost ~]# cat file |awk -F ‘:‘ ‘/^book/{printf $0}END{print xxxoo}‘
book: abcbook: efgbook: zzz
[root@localhost ~]#
Awk 的数组
[root@localhost ~]# cat file
a 1
a 2
b 3
b 4
[root@localhost ~]# cat file|awk ‘{a[$1]=a[$1]+$2}END{for(i in a) {print i,a[i]}}‘
a 3
b 7
[root@localhost ~]#
[root@web1 ~]# cat file
1
2
3
4
5
6
7
8
9
10
[root@web1 ~]# cat file |awk ‘{a[NR]=$0}END{for(i=1;i<=NR;i++){print i,a[i]}}‘
1 1
2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
[root@web1 ~]# cat file |awk ‘{a[NR]=$0}END{for(i=1;i<=NR-3;i++){print i,a[i]}}‘
1 1
2 2
3 3
4 4
5 5
6 6
7 7
[root@web1 ~]#
++a ==1 ? 先执行a+1, 再把结果和1 对比
A++ ==2 ? 先拿A和2对比,再执行A+1。
Awk 的所有正则都需要 // 斜线包起来。
数组去重:
[root@web1 ~]# cat file
1
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
[root@web1 ~]# cat file |awk ‘!a[$0]++‘
1
2
3
4
5
6
7
8
9
10
[root@web1 ~]#
按$4 列去重
[root@web1 ~]# cat file |wc -l
7
[root@web1 ~]# cat file
2018/1/10 liu aaa 1567623
2018/3/2 zhang sss 12845
2018/2/3 li bbc 13432345
2018/4/1 huang cc 12845
2018/2/3 bai gg cc
2018/1/10 du dd 12845
2018/9/3 qio cc 12845
[root@web1 ~]# cat file|awk ‘!a[$4]++‘
2018/1/10 liu aaa 1567623
2018/3/2 zhang sss 12845
2018/2/3 li bbc 13432345
2018/2/3 bai gg cc
[root@web1 ~]# cat file|awk ‘!a[$4]++‘|wc -l
4
[root@web1 ~]#
或者
Awk 计数:
[root@web1 ~]# cat file
1 q
2
3
4
5
6
7
8
9
10
1
2
3
4
5
6
7
8
9
10
[root@web1 ~]# cat file |awk ‘{a[$1]=a[$1]+1}END{for(i in a){print i ,a[i]}}‘
4 2
5 2
6 2
7 2
8 2
9 2
10 2
1 2
2 2
3 2
[root@web1 ~]#
awk处理2个文件: