Day 33 三剑客-awk
Day 33 三剑客-awk
#awk内置变量(shell 环境变量)
#NR 行号 number of record
#NF 每行有多少列 number of filed
#FS 指定的分隔符 -F: ==== -vFS=:
#$1 $2 第1列 第2列
#$0 一整行的内容
#OFS output 输出分隔符 显示每一列的时候 每一列之间通过什么分开
awk '{print $1,$2}'
RS record separator记录分隔符 每一行的结束标记 默认为回车
IGNORECASE 是否忽略大小写 1位忽略
1.1 例题1
Head /etc/passwd >passwd.txt 准备环境
以/为分隔符,显示行号和文件内容
[root@CJY scripts]# awk -vRS=/ '{print NR,$0}' passwd.txt
1 root:x:0:0:root:
2 root:
3 bin
4 bash
bin:x:1:1:bin:
5 bin:
6 sbin
7 nologin
1.2 Awk模式 (条件)
模式-pattern 条件 帮助你想要的行
awk 'NR==1{print $2}'
awk 'NR==1'
1.3 回顾正则表达式符号
+ 字符一次或多以上
() 配合后向引用使用 保护我们想要的内容
{} 最少出现m次最多出现n次
? 字符出现一次或0次
1.3.1 第三列中包含数字4
[root@CJY scripts]# awk -F: '$3~/4/' passwd.txt
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
1.4 例题2
mkdir -p /server/files/ 准备环境
cat >>/server/files/reg.txt<<EOF
姓氏 名字 ID号码 三次捐款数量
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
[root@CJY files]# cat reg.txt|awk '$3~/^4/'
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
1.4.1 显示Xiaoyu的姓氏和id号码
[root@CJY files]# awk '$2~/Xiaoyu/{print $1,$2,$3}' reg.txt
Zhang Xiaoyu 390320151
1.4.2 显示所有以41开头的ID号码的人的全名和ID号码
[root@CJY files]# awk '$3~/^41/{print $1,$2,$3}' reg.txt
Zhang Dandan 41117397
Liu Bingbing 41117483
1.4.3 Id号码最后一位数字是1或5的人的全名
[root@CJY files]# awk '$4~/(1|5)$/{print $1,$2}' reg.txt
Zhang Dandan
Zhang Xiaoyu
Wu Waiwai
Liu Bingbing
Wang Xiaoai
Lao Nanhai
1.4.4 显示Xiaoyu的捐款,每个值时都有以$开头,如$520$200$135
[root@CJY files]# awk -F'[ :]+' -vOFS=$ '$2~/Xiaoyu/{print "$"$4,$5,$6}' reg.txt
$155$90$201
[root@CJY 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.4.5 显示所有人的全名,以姓,名的格式显示出来
[root@CJY files]# awk '{print $1","$2}' reg.txt
Zhang,Dandan
Zhang,Xiaoyu
Meng,Feixue
Wu,Waiwai
Liu,Bingbing
Wang,Xiaoai
Zi,Gege
Li,Youjiu
Lao,Nanhaiei
1.4.6 补充:awk默认动作 过滤
[root@oldboyedu50-lnb /server/files]# awk '$3~/^41/' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
[root@oldboyedu50-lnb /server/files]# awk '$3~/^41/{print }' reg.txt
Zhang Dandan 41117397 :250:100:175
Liu Bingbing 41117483 :250:100:175
'/oldboy/' === '$0~/oldboy/' 默认过滤
'!/oldboy/' === '$0!~/oldboy/'
1.5 gsub awk内置命令(函数)
gsub(//,"",某一列)
gsub(/找谁/,"替换为什么",某一列)
gsub(/找谁/,"替换为什么") === gsub(/找谁/,"替换为什么",$0)
1.6 比较表达式
> 大于
>= 大于等于
== 等于
!= 不等于
<= 小于等于
< 小于
% 运算
1.6.1 显示出磁盘使用率大于20%的磁盘分区名称和挂载点
[root@oldboyedu50-lnb /server/files]# df -h|awk '$5>20{print $1,$NF}'
Filesystem on
/dev/sda3 /
/dev/sda1 /boot
1.6.2 计算磁盘使用率
[root@CJY /server/files]# df |awk 'NR>1{print $3/$2}'
0.344834
0
0.179375
0.00911362
1.6.3 计算系统内存的使用率
[root@CJY /server/files]# free -h
total used free shared buffers cached
Mem: 980M 541M 439M 244K 40M 362M
-/+ buffers/cache: 137M 842M
Swap: 767M 488K 767M
[root@CJY /server/files]# free |awk 'NR>1{print ($3-$6-$7)/$2*100"%"}'
14.0327%
1.7 $5>9 故障
字符串(字母)
/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}'
/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.8 范围
1.8.1 从第1行到第5行内容
sed -n '1,5p'
awk 'NR==1,NR==5'
1.8.2 显示文件中从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.9 特殊模式 BEGIN{} END{}
1.9.1 awk执行的过程
1. 执行命令的参数(赋值) -F -v
2. BEGIN{} 里面的内容 (awk还没有开始读取文件内容)
3. 读取文件内容
1## 判断是否满足条件(模式)
2## 符合 执行命令(动作)
3## 不 读取下一行
4. 文件内容读取完成后,开始执行END{}里面的内容
1.9.2 BEGIN{} 里面的内容 会在 awk读取文件内容之前执行
1# 显示标题
2# 修改awk内置变量 创建变量
awk 'BEGIN{OFS=:}'
awk -vOFS=:
3# 测试 计算
3)END{} ※※※※※ awk读取完文件之后 执行
显示计算结果
先计算,END显示结果
1.9.3 i=i+1 === i++ 统计次数 一共有多少次
#虚拟用户的数量
##条件
##动作:计算次数
[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.9.4 统计/etc/services 文件中空行的数量
[root@oldboyedu50-lnb /server/files]# awk '/^$/{i++}' /etc/services
[root@oldboyedu50-lnb /server/files]# awk '/^$/{i++}END{print i}' /etc/services
16
1.10 总结:
指哪打哪
-F
RS
1.内置变量
2.模式匹配(条件)
1)正则表达式
2)比较
>
<
==
3)范围
4)BEGIN{} END{}
3.awk动作
gsub 函数 (命令)
变量 计算
转载于:https://blog.51cto.com/13859649/2162919