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 回顾正则表达式符号

 正则表达式符号.jpg

+  字符一次或多以上

() 配合后向引用使用   保护我们想要的内容

{} 最少出现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号码最后一位数字是15的人的全名

[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

方法

[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# 测试 计算

3END{} ※※※※※ 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)范围

4BEGIN{} END{}

3.awk动作

print

gsub 函数 (命令)

变量 计算