6,linux 命令 awk3

[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 ~]#
或者

6,linux 命令 awk3

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 ~]#

6,linux 命令 awk3

6,linux 命令 awk3

awk处理2个文件:

 6,linux 命令 awk3

 

6,linux 命令 awk3

上一篇:Linux 变量预设


下一篇:Linux常用命令大全