awk 基本用法

 

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 23 34 12

 

打印第一列

[root@mfsdata02 shell]# awk '{print $1}' file

ll

kk

hh

jj

aa

[root@mfsdata02 shell]# awk -F':' '{print $1}' passwd  #-F 指定分隔符

root

bin

daemon

adm

lp

sync

Shutdown

 

 

[root@mfsdata02 shell]# cat file

ll:1045670921 80 97 70

kk:1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 23 34 12

[root@mfsdata02 shell]# cat file| awk -F'[ :]' '{print $2}' #以冒号和空格为分割符

1045670921

1234566789

1233454562

5234364142

1232341234

 

[root@mfsdata02 shell]# cat file

ll::1045670921 80 97 70

kk:1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 23 34 12

[root@mfsdata02 shell]# cat file| awk -F'[ :]+' '{print $2}' #+表示一个多个,表示连续多个冒号或者空格作为一个处理

1045670921

1234566789

1233454562

5234364142

1232341234

 

[root@mfsdata02 shell]# cat file|awk '{print $2}'

1045670921

1234566789

1233454562

5234364142

1232341234

[root@mfsdata02 shell]# cat file|awk '{print $1,$2}'

ll 1045670921

kk 1234566789

hh 1233454562

jj 5234364142

aa 1232341234

[root@mfsdata02 shell]# cat file|awk '{print $1"+"$2}'

ll+1045670921

kk+1234566789

hh+1233454562

jj+5234364142

aa+1232341234

[root@mfsdata02 shell]# cat file|awk '{print $1"\t"$2}'

ll1045670921

kk1234566789

hh1233454562

jj5234364142

aa1232341234

 

 

NFnumber of field)表示字段数,也就是每行几个字段

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 23 34 12

其中ll 表示第一个字段,1045670921表示第二个字段,80都表示第三个字段,97表示第四个字段,70表示第五个字段,其他行以此类推。

[root@mfsdata02 shell]# cat file|awk '{print $NF}' #取出最后一列

70

90

60

57

12

[root@mfsdata02 shell]# cat file|awk '{print NF}' #NF是多少列

5

5

5

5

5

 

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234    34 12

[root@mfsdata02 shell]# cat file|awk '{print $5}'

70

90

60

57

 

[root@mfsdata02 shell]# cat file|awk '{print $NF}'

70

90

60

57

12

取倒数第二例

[root@mfsdata02 shell]# cat file|awk '{print $(NF-1)}'

97

90

60

58

34

 

NR行数 FNR 相对行数

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# awk '{print NR}' file

1

2

3

4

5

[root@mfsdata02 shell]# awk '{print NR}' file file1

1

2

3

4

5

6

7

8

9

10

[root@mfsdata02 shell]# awk '{print FNR}' file file1

1

2

3

4

5

1

2

3

4

5

 

打印第二行和第三行

[root@mfsdata02 shell]# cat file1

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file|awk 'NR>1&&NR<4{print $0}'

kk 1234566789 90 90 90

hh 1233454562 60 60 60

只打印第三行

[root@mfsdata02 shell]# cat file|awk 'NR==3{print $0}'

hh 1233454562 60 60 60

打印第三行第一列

[root@mfsdata02 shell]# cat file|awk 'NR==3{print $1}'

Hh

打印除了第一行第一列

[root@mfsdata02 shell]# cat file|awk 'NR!=1{print $1}'

kk

hh

jj

aa

打印第一行第一列,和第二行第二例

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file|awk 'NR==1{print $1}NR==2{print $2}'

ll

1234566789

 

[root@mfsdata02 shell]# cat file|awk 'BEGIN{print "------start--------"}{print $1}END{print "---------end-----"}'

------start--------

ll

kk

hh

jj

aa

---------end-----

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file | awk '{print $0,($3+$4+$5)/3}'

ll 1045670921 80 97 70 82.3333

kk 1234566789 90 90 90 90

hh 1233454562 60 60 60 60

jj 5234364142 69 58 57  61.3333

aa 1232341234 12 34 12 19.3333

 

[root@mfsdata02 shell]# cat file | awk '{print $0,int(($3+$4+$5)/3)}' #int取整

ll 1045670921 80 97 70 82

kk 1234566789 90 90 90 90

hh 1233454562 60 60 60 60

jj 5234364142 69 58 57  61

aa 1232341234 12 34 12 19

[root@mfsdata02 shell]# cat file | awk '{a=$3+$4+$5;print $0,"=",int(a/3)}' #使用变量

ll 1045670921 80 97 70 = 82

kk 1234566789 90 90 90 = 90

hh 1233454562 60 60 60 = 60

jj 5234364142 69 58 57  = 61

aa 1232341234 12 34 12 = 19

 

[root@mfsdata02 shell]# cat 10.txt

1

2

3

4

5

6

7

8

9

10

[root@mfsdata02 shell]# cat 10.txt | awk '{a=a+$1}END{print a}'

55

[root@mfsdata02 shell]# cat 10.txt | awk '{a+=$1}END{print a}'

55

 

加最后一列,输出

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

 

[root@mfsdata02 shell]# cat file|awk '{a+=$NF}END{print a}'

289

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

 

打印第三列大于等于80

[root@mfsdata02 shell]# cat file|awk '{if($3>=80){print $0}}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

等价于

[root@mfsdata02 shell]# cat file|awk '$3>=80{{print $0}}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

[root@mfsdata02 shell]# ll

total 24

-rw-r--r-- 1 root root   21 Jan 18 18:47 10.txt

-rw-r--r-- 1 root root  116 Jan 18 18:12 file

-rw-r--r-- 1 root root  116 Jan 18 18:17 file1

-rw-r--r-- 1 root root  117 Jan 18 17:58 filer

-rw-r--r-- 1 root root 1557 Jan 18 17:55 passwd

-rw-r--r-- 1 root root  105 Jan 18 17:48 shuzu

[root@mfsdata02 shell]# ll |awk '{if($5>21){print $0}}' #打印大于21k的文件

-rw-r--r-- 1 root root  116 Jan 18 18:12 file

-rw-r--r-- 1 root root  116 Jan 18 18:17 file1

-rw-r--r-- 1 root root  117 Jan 18 17:58 filer

-rw-r--r-- 1 root root 1557 Jan 18 17:55 passwd

-rw-r--r-- 1 root root  105 Jan 18 17:48 shuzu

[root@mfsdata02 shell]# ll |awk '{if($5>200){print $0}}' #打印大于200k文件

-rw-r--r-- 1 root root 1557 Jan 18 17:55 passwd

 

[root@mfsdata02 shell]# ll |awk '/^-/{if($5>200){print $0}}'  #正则,以-开头的

-rw-r--r-- 1 root root 1557 Jan 18 17:55 passwd

 

AWK 中变量

[root@mfsdata02 shell]# cat file|awk '{print NF}'

5

5

5

5

5

[root@mfsdata02 shell]# cat file|awk '{print NR}'

1

2

3

4

[root@mfsdata02 shell]# cat file|awk '{a=NF-1;print a}'

4

4

4

4

4

[root@mfsdata02 shell]# cat file|awk 'BEGIN{a=2}{print a}'

2

2

2

2

2

[root@mfsdata02 shell]# a=2

[root@mfsdata02 shell]# cat file|awk '{print $a}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

$a是在awk中是为0,所以等于打印所有

[root@mfsdata02 shell]# cat file|awk '{print '$a'}' #要是引用外面的a必须价格‘’

2

2

2

2

2

或者

[root@mfsdata02 shell]# cat file|awk -va=2 '{print a}'

2

2

2

2

2

 

awkfor循环

每个都单独输出作为一行

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file|awk '{for(i=1;i<=NF;i++){print $i}}'

ll

1045670921

80

97

70

kk

1234566789

90

90

90

hh

1233454562

60

60

60

jj

5234364142

69

58

57

aa

1232341234

12

34

12

打印 奇数行

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file|awk '{for (i=1;i<=NF;i+=2){ printf $i" "}}'

ll 80 70 kk 90 90 hh 60 60 jj 69 57 aa 12 12 [root@mfsdata02 shell]#

[root@mfsdata02 shell]# cat file|awk '{for (i=1;i<=NF;i+=2){ printf $i" "}print " "}'

ll 80 70  

kk 90 90  

hh 60 60  

jj 69 57  

aa 12 12

printf 不加换行符,print是加换行符

 

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file| awk '{if ($1=="ll") print $0}'

ll 1045670921 80 97 70

 

替换列,第一列不是ll都替换成aa

[root@mfsdata02 shell]# cat file

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 shell]# cat file| awk '{if($1=="ll"){print $0}else{$1="aa";print $0}}'

ll 1045670921 80 97 70

aa 1234566789 90 90 90

aa 1233454562 60 60 60

aa 5234364142 69 58 57

aa 1232341234 12 34 12

 

[root@mfsdata02 shell]# who

leco     tty1         2017-01-18 15:39 (:0)

leco     pts/0        2017-01-18 15:39 (:0.0)

leco     pts/1        2017-01-18 15:53 (:0.0)

leco     pts/2        2017-01-18 16:22 (192.168.5.1)

leco     pts/4        2017-01-18 17:26 (192.168.5.1)

leco     pts/5        2017-01-18 17:31 (192.168.5.1)

[root@mfsdata02 shell]# who | awk '{a++}END{print a}'

6

[root@mfsdata02 shell]# awk 'BEGIN{while("who"|getline)n++;print n}'

6

[root@mfsdata02 shell]# who | awk '{a++}END{print a >"xxx.txt"}'

[root@mfsdata02 shell]# ls

10.txt  file  file1  filer  passwd  shuzu  xxx.txt

[root@mfsdata02 shell]# cat xxx.txt

6

[root@mfsdata02 shell]# cat file|awk '/45/{print $0}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

aa 1232341234 12 34 12 45

[root@mfsdata02 shell]# cat file|awk '$2~/45/{print $0}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

[root@mfsdata02 shell]# cat file|awk '{if($2~/45/)print $0}'

ll 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

打印以ll开头的$2中包含45的行

[root@mfsdata02 shell]# cat file|awk '/^ll/{if($2~/45/)print $0}'

ll 1045670921 80 97 70

或者

[root@mfsdata02 shell]# cat file|awk '/^ll/&&$2~/45/{print $0}'

ll 1045670921 80 97 70

&& 表示或者

 

[root@mfsdata02 ~]#

[root@mfsdata02 ~]# awk 'BEGIN{while("who"|getline){n++}print n}'

4

[root@mfsdata02 ~]# who

leco     tty1         2017-01-18 15:39 (:0)

leco     pts/0        2017-01-18 15:39 (:0.0)

leco     pts/1        2017-01-18 15:53 (:0.0)

leco     pts/2        2017-01-19 13:16 (192.168.5.1)

[root@mfsdata02 ~]# who | awk '{n++}END{print n}'

4

 

统计文件中某个单词使用的次数

[root@mfsdata02 ~]# cat file

lx 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

[root@mfsdata02 ~]# cat file | awk '{for(i=1;i<NF;i++){if($i=="60"){n++}}}END{print n}'

2

 

Awk列累加

 

[root@mfsdata02 ~]# df -h

Filesystem      Size  Used Avail Use% Mounted on

/dev/sda2       884G  5.2G  834G   1% /

tmpfs           491M  232K  491M   1% /dev/shm

/dev/sda1       283M   97M  172M  37% /boot

/dev/sdb1       493G  3.0G  465G   1% /mfsdata

[root@mfsdata02 ~]#  df -h|sed "1d"|awk -F'[ %]+' '{a+=$5}END{print a}'

40

删除后四行

[root@mfsdata02 ~]# cat 10

1

2

3

4

5

6

7

8

9

10

[root@mfsdata02 ~]# cat 10 | awk 'NR==FNR{a++}NR!=FNR{if(FNR<=a-4)print $0}' 10 10

1

2

3

4

5

6

NR==FNR{a++} 先统计行数也就是统计第一个文件。

NR!=FNR是处理第二个文件

等价

[root@mfsdata02 ~]# cat 10 |head -n -4

1

2

3

4

5

6

[root@mfsdata02 ~]# awk '1' file #打印整个文件

lx 1045670921 80 97 70

kk 1234566789 90 90 90

hh 1233454562 60 60 60

jj 5234364142 69 58 57

aa 1232341234 12 34 12

 

[root@mfsdata02 ~]# awk '{$1="lx"}1' file #$1替换成1x

lx 1045670921 80 97 70

lx 1234566789 90 90 90

lx 1233454562 60 60 60

lx 5234364142 69 58 57

lx 1232341234 12 34 12

[root@mfsdata02 ~]# awk '{$1="lx"}1{print $0}' file

lx 1045670921 80 97 70

lx 1234566789 90 90 90

lx 1233454562 60 60 60

lx 5234364142 69 58 57

lx 1232341234 12 34 12