一 . awk工具概述

     awk编程语言/数据处理引擎

  • 创造者:Aho、Weinberger、Kernighan

  • 基于模式匹配检查输入文本,逐行处理并输出

  • 通常用在shell脚本中,获取指定的数据

  • 单独用时,可对文本数据做统计

     命令格式解析

  •    主要用法

        格式1:前置命令 | awk [选项] '[条件]{指令}'

        格式2:awk [选项] '[条件]{指令}'  文件...

  •   常用命令选项

        -F :指定分隔符,可省略(默认空格或Tab)



二 . 使用awk提取文本

 2.1 实例1 (直接过滤文件内容)

[root@client ~]# cat awktest.txt 
hello the world
this is  shanghai
[root@client ~]# awk '{print $1,$3}' awktest.txt 
hello world
this shanghai


2.2 实例2 (打印磁盘剩余空间)

[root@client ~]# df -h | awk '{print $4}'
可用
14G
897M
912M
903M
912M
0
836M
183M
183M

2.3 实例3 (输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开

[root@client ~]# awk -F: '{print $1,$7}' /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
... ...

2.4 实例4 (awk的print指令不仅可以打印变量,还可以打印常量

[root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
[root@svr5 ~]# awk -F: '{print $1,"的解释器:",$7}' /etc/passwd
root 的解释器: /bin/bash
bin 的解释器: /sbin/nologin
… …

2.5 实例5 (提取网卡信息中RX bytes与TX bytes)

[root@client ~]# ifconfig ens33 | awk '/RX p/{print $5}' 
85570
[root@client ~]# ifconfig ens33 | awk '/TX p/{print $5}' 
94377


三 . awk过滤的时机

  •  在所有行前处理,BEGIN{ }

      读入第一行文本之前执行

      一般用来初始化操作

  • 逐行处理,{ }

      逐行读入文本执行相应的处理

      是最常见的编辑指令块

  • 在所有行后处理,END{ }

      处理完最后一行文本之后执行

      一般用来输出处理结果


 3.1  实例1

[root@client ~]# awk 'BEGIN {a=35;print a+12}'
47

3.2  实例2 (统计系统中使用bash作为登录Shell的用户总个数

[root@client ~]# awk 'BEGIN{x=0}/bash$/{x++} END{print x}' /etc/passwd
5


四 . awk处理时机

 4.1 正则表达式

     实例1

[root@client ~]# awk -F: '/^ro/{print}' /etc/passwd
root:x:0:0:root:/root:/bin/bash

    实例2

[root@client ~]# awk -F: '$7!~/bash$/{print $1,$7}' /etc/passwd
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
sync /bin/sync
shutdown /sbin/shutdown

4.2 数值比较

  • ==等于、!=不等于

  • >大于、>=大于或等于

  • <小于、<=小于或等于

   实例1

[root@client ~]# cat awkreg.txt
abcd xx
xx 
abcabcd xx
[root@client ~]# awk 'NR==2{print}' awkreg.txt      //输出第二行文本
xx
[root@client ~]# awk '$2!="xx"{print}' awkreg.txt   //输出第二列不是xx的行
xx 
[root@client ~]# awk 'NF>=2{print}' awkreg.txt      //输出包含2个及以上字段的行
abcd xx
abcabcd xx

4.3 逻辑比较测试

  •   && 逻辑与:期望多个条件都成立

  •   || 逻辑或:只要有一个条件成立立即满足要求

实例

[root@client ~]# awk -F:'$3>=0&&$3<2{print$1,$3}' /etc/passwd  //列出UID小于2的用户信息
root 0
bin 1
[root@client ~]# awk -F:'$3==1||$3==7{print$1,$3}' /etc/passwd  //列出UID为1或7的用户信息
bin 1
halt 7

4.4 运算符

  • +、-、*、/、%

  • ++、--、+=、-=、*=、/=

 实例

[root@client ~]# awk 'NR%2==1{print}' awkreg.txt 
abcd xx
abcabcd xx
[root@client ~]# awk 'BEGIN{i=0}{i+=NF}END{print i}' awkreg.txt 
5


五 . awk流程控制

分支结构

  •  单分支

   if(条件){编辑指令}

  •  双分支

   if(条件){编辑指令1}else{编辑指令2}

  •  多分支

   if(条件){编辑指令1}else if(条件){编辑指令2}.. ..

    else{编辑指令N}

5.1 单分支实例

[root@client ~]# awk -F: '{if($3<=1000){i++}}END{print i}' /etc/passwd  
                                                   //统计/etc/passwd中UID小于等于1000的用户个数
39 
[root@client ~]# awk -F: '{if($3>1000){i++}}END{print i}' /etc/passwd
                                                   //统计/etc/passwd文件中UID大于1000的用户个数
4
[root@client ~]# awk -F: '{if($7~/bash$/){i++}}END{print i}'  /etc/passwd
                                                  //统计/etc/passwd文件中登录Shell是“/bin/bash”的用户个数
5

5.2 双分支实例

[root@client ~]# awk -F: '{if($3<=500){i++}else{j++}}END{print i,j}' /etc/passwd
                             //分别统计/etc/passwd文件中UID小于或等于1000、UID大于1000的用户个数
30 13
[root@client ~]# awk -F: '{if($7~/bash$/){i++}else{j++}} END{print i,j}' /etc/passwd
                            //分别统计/etc/passwd文件中登录Shell是“/bin/bash”、 登录Shell不是“/bin/bash”的用户个数
5 38


六 . awk数组

数组的定义及使用

  •  定义数组

   格式:数组名[下标]=元素值

  • 调用数组

   格式:数组名[下标]

  • 遍历数组

   用法:for(变量 in 数组名){print 数组名[变量]}

6.1 实例

[root@svr5 ~]# awk 'BEGIN{a[0]=11;a[1]=88;print a[1],a[0]}'
88 11
[root@svr5 ~]# awk 'BEGIN{a++;print a}'
1
[root@svr5 ~]# awk 'BEGIN{a0++;print a0}'
1
[root@svr5 ~]# awk 'BEGIN{a[0]++;print a[0]}'
1
[root@svr5 ~]# awk 'BEGIN{a[0]=00;a[1]=11;a[2]=22; for(i in a){print i,a[i]}}'
0 0
1 11
2 22