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<

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{}里面的内容

2BEGIN{}   里面的内容 会在 awk读取文件内容之前执行

  1显示标题

  2修改awk内置变量 创建变量

awk 'BEGIN{OFS=:}'

awk -vOFS=:

3测试 计算

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