1.1 awk内置变量
FS 输入字段(列)分隔符
-F :
NR
NF
OFS
RS 记录分隔符 每一的结束标记 默认是回车
IGNORECASE 是否忽略大小写 1为忽略
1.1.1 正则表达式
~ 某一列中包含xxx
!~ 某一列中不包含xxx
awk '$3 ~/4/' oldboy.txt 第3列中包含数字4
^ 以....开头的字符(列)
$ 以....结尾的字符(列)
.* 匹配所有字符
^$ 匹配空行
\ 转义字符 backslash 脱掉马甲打回原形
[] 匹配字符
+ 出现一次或一次以上
~ 匹配包含.....的字符
创建环境
mkdir -p /server/files/
cat >>/server/files/reg.txt<<EOF
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
Wang Xiaoai 3515064655 :50:95:135
Zi Gege 1986787350 :250:168:200
Li Youjiu 918391635 :175:75:300
Lao Nanhai 918391635 :250:100:175
EOF
第一列是姓氏
第二列是名字
第一第二列合起来就是姓名
第三列是对应的ID号码
最后三列是三次捐款数量
1.第3列中 以数字4开头的
[root@oldboyedu50-lnb /server/files]# awk '$3~/^4/' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
2.显示Xiaoyu的姓氏和ID号码
[root@oldboyedu50-lnb /server/files]# awk '$2~/Xiaoyu/' reg.txt
Zhang Xiaoyu 390320151 :155:90:201
[root@oldboyedu50-lnb /server/files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt
Zhang Xiaoyu 390320151
3.显示所有以41开头的ID号码的人的全名和ID号码
[root@oldboyedu50-lnb /server/files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
4.显示所有ID号码最后一位数字是1或5的人的全名
[root@oldboy50-01 /server/files]# awk '$3~/[15]$/{print $1$2}' reg.txt
ZhangXiaoyu
WuWaiwai
WangXiaoai
LiYoujiu
LaoNanhai
5.显示Xiaoyu的捐款.每个值时都有以$开头.如$520$200$135
方法一
[root@oldboy50-01 /server/files]# awk '$2~/Xiaoyu/{gsub(/:/,"$");print $4}' reg.txt
$155$90$201
方法二
[root@oldboy50-01 /server/files]# sed 's#:#$#g' reg.txt |awk '$2~/Xiaoyu/{print $4,$5$6}'
$155$90$201
方法三
[root@oldboy50-01 /server/files]# awk -F'[: ]+' -vOFS=$ '$2~/Xiaoyu/{print "$"$4,$5,$}' reg.txt
$155$90$201
6.显示所有人的全名,以姓,名的格式显示,如Meng,Feixue
[root@oldboy50-01 /server/files]# awk '{print $1","$2}' reg.txt
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhai
1.1.2 替换
gsub awk内置命令(函数)
gsub(//,"",某一列)
[root@oldboyedu50-lnb /server/files]# awk '{gsub(/:/,"$"); print}' 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
Wang Xiaoai 3515064655 $50$95$135
Zi Gege 1986787350 $250$168$200
Li Youjiu 918391635 $175$75$300
Lao Nanhai 918391635 $250$100$175
1.1.3 比较表达式
$5>500
NR>20
>
>=
==
!=
<=
<
实例1-1 显示出磁盘使用率大于20%的磁盘分区名称和挂载点
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5>20{print $1,$NF}'
Filesystem on
/dev/sda3 /
/dev/sda1 /boot
实例1-2 $5>9 故障
awk默认输出为字符串(字母)
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5>2{print $1,$5,$NF}'
Filesystem Use% on
/dev/sda3 21% /
/dev/sda1 22% /boot
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5<9{print $1,$5,$NF}'
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5<9{print $1,$5,$NF}'
/dev/sda3 21% /
tmpfs 0% /dev/shm
/dev/sda1 22% /boot
方法0
[root@oldboyedu50-lnb /server/files]# df -h|awk -F '[ %]+' 'NR>1 && $5>9'
/dev/sda3 19G 3.7G 15G 21% /
/dev/sda1 190M 40M 141M 22% /boot
方法1-指定分隔符只保留数字部分
[root@oldboyedu50-lnb /server/files]# df -h|awk -F '[ %]+' '$5>5'
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 3.7G 15G 21% /
/dev/sda1 190M 40M 141M 22% /boot
[root@oldboyedu50-lnb /server/files]# df -h|awk -F '[ %]+' '$5>9'
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 3.7G 15G 21% /
/dev/sda1 190M 40M 141M 22% /boot
[root@oldboyedu50-lnb /server/files]# df -h|awk -F '[ %]+' '$5<9'
tmpfs 931M 0 931M 0% /dev/shm
解决方法2- 某一列+0
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5+0>9'
/dev/sda3 19G 3.7G 15G 21% /
/dev/sda1 190M 40M 141M 22% /boot
实例1-3 计算磁盘使用率
[root@oldboyedu50-lnb /server/files]# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/sda3 19G 3.7G 15G 21% /
tmpfs 931M 0 931M 0% /dev/shm
/dev/sda1 190M 40M 141M 22% /boot
[root@oldboyedu50-lnb /server/files]# df
Filesystem 1K-blocks Used Available Use% Mounted on
/dev/sda3 19534104 3783668 14751476 21% /
tmpfs 953128 0 953128 0% /dev/shm
/dev/sda1 194241 40003 143998 22% /boot
[root@oldboyedu50-lnb /server/files]# df |awk 'NR>1{print $3/$2}'
0.193695
0
0.205945
实例1-4 计算系统内存的使用率
[root@oldboyedu50-lnb /server/files]# free |awk '/Mem/{print ($3-$6-$7)/$2}'
0.07689
[root@oldboyedu50-lnb /server/files]# free |awk '/Mem/{print ($3-$6-$7)/$2*100"%"}'
7.67116%
[root@oldboyedu50-lnb /server/files]# free|awk 'NR==3{print $3/($3+$4)}'
0.0768963
[root@oldboyedu50-lnb /server/files]# free|awk 'NR==3{sum=$3+$4;print sum}'
1906256
[root@oldboyedu50-lnb /server/files]# free|awk 'NR==3{sum=$3+$4;print $3/sum,$4/sum}'
0.0768459 0.923154
1.1.4 范围
实例1-5 显示文件中从oldboy行到yy行
[root@oldboyedu50-lnb /server/files]# sed -n '/oldboy/,/yy/p' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
[root@oldboyedu50-lnb /server/files]# awk '/oldboy/,/yy/' person.txt
101,oldboy,CEO
102,zhangyao,CTO
103,Alex,COO
104,yy,CFO
1.1.5 特殊模式 BEGIN{} END{}
1)awk执行的过程
1执行命令的参数(赋值) -F -v
2 BEGIN{} 里面的内容 (awk还没有开始读取文件内容)
3读取文件内容
1判断是否满足条件(模式)
2符合 执行命令(动作)
3不读取下一行
4文件内容读取完成后,开始执行END{}里面的内容
2)BEGIN{} 里面的内容 会在 awk读取文件内容之前执行
1显示标题
2修改awk内置变量 创建变量
awk 'BEGIN{OFS=:}'
awk -vOFS=:
3测试 计算
3)END{} ※※※※※ awk读取完文件之后 执行
显示计算结果
先计算,END显示结果
实例1-6 计算虚拟用户的数量
[root@oldboyedu50-lnb /server/files]# awk '/nologin$/' passwd.txt
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
uucp:x:10:14:uucp:/var/spool/uucp:/sbin/nologin
[root@oldboyedu50-lnb /server/files]# awk '/nologin$/{i=i+1;print i}' passwd.txt
1
2
3
4
5
6
[root@oldboyedu50-lnb /server/files]# awk '/nologin$/{i=i+1}END{print i}' passwd.txt
6
实例1-7 统计/etc/services 文件中空行的数量
[root@oldboyedu50-lnb /server/files]# awk '/^$/{i++}' /etc/services
[root@oldboyedu50-lnb /server/files]# awk '/^$/{i++}END{print i}' /etc/services
16