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
NF(number 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
awk中for循环
每个都单独输出作为一行
[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