awk基本用法 awk高级应用

案例1:使用awk提取文本
案例2:awk处理条件
案例3:awk综合脚本应用
案例4:awk流程控制
案例5:awk扩展应用
1 案例1:使用awk提取文本
1.1 问题

本案例要求使用awk工具完成下列过滤任务:
练习awk工具的基本用法
提取本机的网卡流量、根分区剩余容量、获取SSH远程失败的IP地址
格式化输出/etc/passwd文件中的用户名、UID、宿主目录信息
1.2 步骤

实现此案例需要按照如下步骤进行。
步骤一:awk文本过滤的基本用法

1)基本操作方法
格式:awk [选项] ‘[条件]{指令}’ 文件
其中,print 是最常用的编辑指令;若有多条编辑指令,可用分号分隔。
Awk过滤数据时支持仅打印某一列,如第2列、第5列等。
处理文本时,若未指定分隔符,则默认将空格、制表符等作为分隔符。
直接过滤文件内容:
[[email protected] ~]# cat test.txt
hello the world
welcome to beijing
[[email protected] ~]# awk ‘{print 1,3}’ test.txt //打印文档第1列和第3列
hello world
welcome beijing
结合管道过滤命令输出:
awk基本用法 awk高级应用
2)选项 -F 可指定分隔符
输出passwd文件中以分号分隔的第1、7个字段,显示的不同字段之间以逗号隔开,操作如下:
[[email protected] ~]# awk -F: ‘{print 1,7}’ /etc/passwd
root /bin/bash
bin /sbin/nologin
daemon /sbin/nologin
adm /sbin/nologin
lp /sbin/nologin
… …
awk还识别多种单个的字符,比如以“:”或“/”分隔,输出第1、10个字段:
[[email protected] ~]# awk -F [:/] ‘{print 1,10}’ /etc/passwd
root bash
bin nologin
daemon nologin
adm sbin
… …
awk常用内置变量:
01 文本的第1列
223 文件的第3列,依此类推
NR 文件当前行的行号
NF 文件当前行的列数(有几列)
输出每次处理行的行号,以及当前行以“:”分隔的字段个数(有几列):
[[email protected] ~]# awk -F: ‘{print NR,NF}’ passwd.txt
1 7
2 7
3 7
.. ..
2)awk的print指令不仅可以打印变量,还可以打印常量
[[email protected] ~]# awk -F: ‘{print 1,":",7}’ /etc/passwd
root 的解释器: /bin/bash
bin 的解释器: /sbin/nologin
… …
步骤二:利用awk提取本机的网络流量、根分区剩余容量、获取远程失败的IP地址

1)提取IP地址
分步实现的思路及操作参考如下——
通过ifconfig eth0查看网卡信息,其中包括网卡流量:
awk基本用法 awk高级应用
RX为接收的数据量,TX为发送的数据量。packets以数据包的数量为单位,bytes以字节为单位:
awk基本用法 awk高级应用
2)提取根分区剩余容量
分步实现的思路及操作参考如下——
通过df命令查看根分区的使用情况,其中包括剩余容量:
[[email protected] ~]# df -h /
文件系统 容量 已用 可用 已用% 挂载点
/dev/sda2 19G 7.2G 11G 40% /
输出上述结果中最后一行的第4列:
awk基本用法 awk高级应用

3)根据/var/log/secure日志文件,过滤远程连接密码失败的IP地址
[[email protected] ~]# awk ‘/Failed/{print $11}’ /var/log/secure
192.168.2.254
192.168.2.100
… …
步骤三:格式化输出/etc/passwd文件

1)awk处理的时机
awk会逐行处理文本,支持在处理第一行之前做一些准备工作,以及在处理完最后一行之后做一些总结性质的工作。在命令格式上分别体现如下:
awk [选项] ‘[条件]{指令}’ 文件
awk [选项] ’ BEGIN{指令} {指令} END{指令}’ 文件
BEGIN{ } 行前处理,读取文件内容前执行,指令执行1次
{ } 逐行处理,读取文件过程中执行,指令执行n次
END{ } 行后处理,读取文件结束后执行,指令执行1次
只做预处理的时候,可以没有操作文件,比如:
[[email protected] ~]# awk ‘BEGIN{A=24;print A*2}’
[[email protected] ~]# awk ‘BEGIN{print x+1}’ #x可以不定义,直接用,默认值位0
[[email protected] ~]# awk ‘BEGIN{print 3.2+3.5}’
举个例子(统计系统中使用bash作为登录Shell的用户总个数):
a.预处理时赋值变量x=0
b.然后逐行读入/etc/passwd文件,如果发现登录Shell是/bin/bash则x加1
c.全部处理完毕后,输出x的值即可。相关操作及结果如下:
[[email protected] ~]# awk ‘BEGIN{x=0}/bash$/{x++} END{print x}’ /etc/passwd
29
2)格式化输出/etc/passwd文件
要求: 格式化输出passwd文件内容时,要求第一行为列表标题,中间打印用户的名称、UID、家目录信息,最后一行提示一共已处理文本的总行数,如图-1所示。
awk基本用法 awk高级应用
3)根据实现思路编写、验证awk过滤语句
输出信息时,可以使用“\t”显示Tab制表位:
awk基本用法 awk高级应用
2 案例2:awk处理条件
2.1 问题

本案例要求使用awk工具完成下列过滤任务,注意awk处理条件的设置:
列出UID间于1~1000的用户详细信息
输出/etc/hosts文件内以127或192开头的记录
列出100以内整数中7的倍数或是含7的数
2.2 步骤

实现此案例需要按照如下步骤进行。
步骤一:认识awk处理条件的设置

1)使用正则设置条件
输出其中以bash结尾的完整记录:

awk基本用法 awk高级应用
awk基本用法 awk高级应用
2)使用数值/字符串比较设置条件

awk基本用法 awk高级应用
awk基本用法 awk高级应用
3)逻辑测试条件
awk基本用法 awk高级应用
awk基本用法 awk高级应用
root:x:0:0:root:/root:/bin/bash
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
sync:x:5:0:sync:/sbin:/bin/sync
shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown
halt:x:7:0:halt:/sbin:/sbin/halt
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
varnish:x:1001:1001::/home/varnish:/sbin/nologin
nginx:x:1002:1002::/home/nginx:/sbin/nologin
4)数学运算
[[email protected] ~]# awk ‘BEGIN{x++;print x}’
1
[[email protected] ~]# awk ‘BEGIN{x=8;print x+=2}’
10
[[email protected] ~]# awk ‘BEGIN{x=8;x–;print x}’
7
[[email protected] ~]# awk ‘BEGIN{print 2+3}’
5
[[email protected] ~]# awk ‘BEGIN{print 2*3}’
6
[[email protected] ~]# awk ‘BEGIN{print 2*3}’
6
[[email protected] ~]# awk ‘BEGIN{ print 23%8}’
7
[[email protected] ~]# seq 200 | awk ‘$1%3==0’ //找200以内3的倍数
… …
步骤二:完成任务要求的awk过滤操作

awk基本用法 awk高级应用
2)输出/etc/hosts映射文件内以127或者192开头的记录:
[[email protected] ~]# awk ‘/^(127|192)/’ /etc/hosts
127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.4.5 svr5.tarena.com svr5
3)列出100以内整数中7的倍数或是含7的数:
[[email protected] ~]# seq 100 | awk ‘11~/7/’
7
14
17
21
27
28
35
37
42
47
.. ..
3 案例3:awk综合脚本应用
3.1 问题

本案例要求编写脚本,实现以下需求:
找到使用bash作登录Shell的本地用户
列出这些用户的shadow密码记录,如图-2所示
awk基本用法 awk高级应用
3.2 步骤

实现此案例需要按照如下步骤进行。
步骤一:任务需求及思路分析

编写脚本的任务要求如下:
分析出使用bash作登录Shell的本地用户
列出这些用户的shadow密码记录
按每行“用户名 – 密码记录”保存结果
步骤二:根据实现思路编写脚本
awk基本用法 awk高级应用
awk基本用法 awk高级应用
awk基本用法 awk高级应用
awk基本用法 awk高级应用
awk基本用法 awk高级应用
awk基本用法 awk高级应用