- awk由三个人写的一个软件,Aho Wwinberger Kernighan 也可以说awk是一个编程语言,在awk里边有自己的变量,有if判断,有while判断,有fro循环,支持基本正则,扩展正则,支持数组等功能。
- awk主要的核心作用是用来做数据过滤,数据处理,数据统计,awk处理流程是逐行处理。
- awk命令格式:
格式1:前置命令 | awk 选项 ‘条件{指令}’
格式2:awk 选项 ‘条件{指令}’ 文件.. ..
格式3:awk 选项 ‘BEGIN{指令} {指令} END{指令}’ 文件
- BEGIN{} 做行前处理,读取文件内容前执行,指令执行1次
- {} 做逐行处理,读取文件过程中执行,指令执行n次
- END{} 做行后处理,读取文件结束后执行,指令执行1次
- 在awk里边所有的指令都必须要用{}括起来,在学习awk时,学的最多的并不是指令,而是选项和条件,它主要的作用时用来过滤数据的,所以指令用的最多的就是print打印指令,awk在过滤数据时可以实现对文件中的某一列进行过滤,比如我们在查看系统内存信息的时候,我们关心的是剩余多少内存,那如果用awk过滤的时候,我们就可以指定获取内存剩余的列
- 查看内存剩余情况:通过正则匹配内存信息,打印剩余内存的列
[root@test ~]# free | awk '/Mem/{print $4}'
663612
- 查看系统根分区剩余情况:通过正则匹配以根结尾的行,打印可用信息列
[root@test ~]# df | awk '//$/{print $4}'
13704824
- 创建素材
[root@test opt]# vim test.txt
hello the woman
welcome to china
- 打印test.txt文件中第一列和第三列
[root@test opt]# awk '{print $1,$3}' test.txt
hello woman
welcome china
解释:现在这种过滤方式没有指定选项,也没有指定条件,只指定了打印的列数,当没有条件时,默认时逐行处理
- awk命令格式解析:
awk有一个最常用的选项 -F ,-F可以指定分隔符,也就是文件中用来分隔没一列的分隔符,当我们不指定文件内列与列之间的分隔符,那awk默认会以空格和tab键作为文件内的默认分隔符,例如/etc/passwd这个文件就是一个最好的例子
![7ea5556bb558e2d54fcbbb2e257bcdcc.png](https://i-blog.csdnimg.cn/blog_migrate/28930564ab7398871821336c15b95970.png)
当我向要把文件中的第一列打印出来时,按照我们的理解应该是用户名字段,可是它却把所有的内容都打印出来了,由于awk默认情况下是以空格和tab键作为列之间的分隔符,那它去匹配的时候发现这个文件从头到尾都没有发现一个空格和tab键,所以它会认为一行就是一列,而我们系统里边有的文件不可能都是那么规整 不可能全都用空格隔开的,有的文件它可能是用逗号分隔,有的是用其他的符号分隔的,他就是没用空格隔开!那这个时候用awk是没有办法过滤到我们想要的信息的,那这个时候怎么办?这个时候就要用到一个选项来指定分隔符,-F ,-F是awk最常用的选项,它可以指定任何分隔符,在-F后边写什么,那它就会认为什么是分隔符,可以指定分隔符以后在来过滤这个文件的话就好办了
![dd4ceefc54ecce859fd0ffb3a7d64343.png](https://i-blog.csdnimg.cn/blog_migrate/50ed5a2b08eec9153b8224ff55da9d42.png)
指定以冒号为分隔符,打印出来的就是文件内的第一列
- 打印第一列与第七列
![5fe97df60edf09a1b220da7506c97874.png](https://i-blog.csdnimg.cn/blog_migrate/faea9210ce5989d357c34e700be5e66b.png)
打印出来的就是用户名和解释器字段,这个文件如果指定以冒号为分隔符还是比较好过滤的,但是有的文件它不一定全都是用这一种符号位分隔符的,就比如有的文件是这样
hello,the,woman
welcome,to,china
2020-06-06
像这样的格式逗号是分隔符,- 号也是分隔符,那像这样的能不能过滤?也可以,可以通过正则表达式里的集合[]去帮我们匹配任意单个字符
![6c6726d20248c623c79de2b21034fb1e.png](https://i-blog.csdnimg.cn/blog_migrate/aeb6dfdeef5c4a5510b883524a331f6f.png)
- awk内置变量:
$1 文件第一列
$2 文件第二列
$3 文件第三列,依此类推
NR 文件当前的行号
NF 文件当前行的列数
- 通过内置变量打印文件的每一行每一列
![8475ac77e62bb800a464f478f687a0ff.png](https://i-blog.csdnimg.cn/blog_migrate/a01d7855a7758defbea6841c555b0abc.png)
- 显示每一行每一列并把最后一列内容打印出来
![fe9a2e1b861488a82f499f61fd864ca1.png](https://i-blog.csdnimg.cn/blog_migrate/ec2babfa8af17c544d6a3b14d3f841cc.png)
- awk除了可以打印变量以外,还可以打印常量,但是通过awk打印常量必须用双引括起来
![bdc34e9024a4862a2c2a7e54b9f65abb.png](https://i-blog.csdnimg.cn/blog_migrate/eb0b4cd88510db629690c7b8c7ed7c53.png)
- 通过awk编写一个监控网卡流量的脚本
[root@test opt]# vim while_liuliang.sh
#!/bin/bash
while :
do
clear
ifconfig ens160 | awk '/inet /{print "IP:",$2}'
ifconfig ens160 | awk '/RX p/{print "入口流量信息:",$5}'
ifconfig ens160 | awk '/TX p/{print "出口流量信息:",$5}'
sleep 0.2
done
- 通过awk编写获取根分区剩余空间和内存剩余空间脚本
[root@test opt]# vim df_free.sh
#!/bni/bash
df -h | awk '//$/{print "根分区剩余:",$4}'
free -h | awk '/Mem/{print "内存剩余:",$4}'